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

时间:2014-02-13 17:55:18

标签: 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;
        }
    }
}

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

static char playerSelection()

它编译并运作。我确实理解静态与非......抽象。

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

我正在从一本书中学习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);
        }
    }
}

问题:

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

谢谢!

1 个答案:

答案 0 :(得分:8)

在他们的示例中,他们正在创建Program实例,并在该实例上调用方法:

(new Program()).run();

这更清晰地写成:

Program program = new Program();
program.run();

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

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

  • 方法名称应为CamelCased;肯定是公共方法,但通常也是私人方法
  • 作者在private是明确的还是隐含的
  • 方面不一致
  • 引用类型的方法名称通常应使用CLR名称而不是C#名称,例如: ReadInt32代替readInt。同样,它对于私人方法并不重要,但进入
  • 是一个坏习惯
  • double用于货币值是非常糟糕的主意
  • p的参数名称不提供任何信息(在不同的地方,用于不同的含义)
  • 对于用户输入,您通常使用TryParse而不是Parse,然后检查返回值,然后在错误输入时重新提示