为什么我必须在不必使用关键字static时使用?

rsg*_*mon 2 c# methods static

我一直在尝试简单的实验来学习C#方法.下面的代码只是调用playerSelection(),它向用户询问一个字符并将该字符返回给Main(string [] args).主要打印到控制台.使用下面的代码我得到以下错误"非静态字段需要对象引用."

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Threading;


namespace SimpleFunction
{
    class Program
    {
        static void Main(string[] args)
        {
        char cplayerChoice = playerSelection();
            Console.WriteLine(cplayerChoice);
        }

        char playerSelection()
        {
            Console.WriteLine("\nEnter a Character");
            char cplayerChoice = Console.ReadKey().KeyChar;
            return cplayerChoice;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在如果我像这样添加单词static:

static char playerSelection()
Run Code Online (Sandbox Code Playgroud)

它编译和工作.我确实理解静态与非......抽象.

好的,所以这里是我困惑的地方,问题来了.

我正在从一本书中学习C#,在那本书中,他们通过下面的例子来说明使用方法:

using System;

namespace GetinPaid
{
    class Program
    {
        static void Main(string[] args)
        {
            (new Program()).run();
        }

        void run()
        {
            double dailyRate = readDouble("Enter your daily rate:");
            int noOfDays = readInt("Enter the number of days: ");
            writeFee(calculateFee(dailyRate, noOfDays));
        }

        private void writeFee(double p)
        {
            Console.WriteLine("The consultant's fee is: {0}", p * 1.1);
        }

        private double calculateFee(double dailyRate, int noOfDays)
        {
            return dailyRate * noOfDays;
        }

        private int readInt(string p)
        {
            Console.Write(p);
            string line = Console.ReadLine();
            return int.Parse(line);
        }

        private double readDouble(string p)
        {
            Console.Write(p);
            string line = Console.ReadLine();
            return double.Parse(line);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

题:

为什么在他们的例子中他们可以调用方法而不使用关键字static但我必须使用它?

谢谢!

Jon*_*eet 8

在他们的榜样,他们正在创建一个实例Program,并呼吁该实例的方法:

(new Program()).run();
Run Code Online (Sandbox Code Playgroud)

这更干净地写成:

Program program = new Program();
program.run();
Run Code Online (Sandbox Code Playgroud)

在这些实例方法中,您可以调用其他实例方法,因为您隐式调用它们this.

顺便说一句,如果真的是书中的示例代码,我建议你得到一本不同的书:那里的风格有一些非常值得怀疑的方面.特别是:

  • 方法名称应为CamelCased; 当然对于公共方法,但通常也是私人的
  • 作者是private明确的还是隐含的不一致
  • 引用类型的方法名称通常应使用CLR名称而不是C#名称,例如ReadInt32代替readInt.同样,它对私人方法来说并不重要,但这是一个不好的习惯
  • 使用double货币价值是一个非常糟糕的主意
  • 参数名称p没有给出信息(在各个地方,用于不同的含义)
  • 对于用户输入,您通常使用TryParse而不是Parse,并检查返回值,然后可能重新输入错误的输入