【问题标题】:Why must I use keyword static when they don't have to?为什么我必须在不需要时使用关键字 static?
【发布时间】:2014-03-12 18:45:45
【问题描述】:

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

    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 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 来调用方法,但我必须使用它?

谢谢!

【问题讨论】:

    标签: c# methods static


    【解决方案1】:

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

    (new Program()).run();
    

    这写得更简洁:

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

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

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

    • 方法名称应该是驼峰式;当然适用于公共方法,但通常也适用于私有方法
    • 作者对private是显式还是隐式不一致
    • 引用类型的方法名称通常应使用 CLR 名称而不是 C# 名称,例如ReadInt32 而不是 readInt。同样,它对于私有方法并不重要,但这是一个坏习惯
    • double 用于货币价值是一个非常糟糕的主意
    • p的参数名没有给出任何信息(在不同的地方,用于不同的含义)
    • 对于用户输入,您通常使用TryParse 而不是Parse,并检查返回值,然后可能会在输入错误时重新提示

    【讨论】:

    • @Logarr:你是说最近的“C# 5.0 All-in-One for Dummies”吗?
    • 不久前我得到了 4.0 版本,以第一次体验 C#。在此之前,我唯一的编程经验是一个学期的 VB.NET。
    • @JonSkeet - 看看你是否愿意为 C# 初学者写一本书 :)
    • @JonSkeet - 好消息 - 将密切关注 Twitter/你的博客,了解何时发布的详细信息 - 这将是我向任何以 C# 开始的人推荐的书 - 我知道我自己因为有 C 和 C++ 背景的自学而养成了坏习惯。您是否会包含很多关于 MVC 和 C# 的 Web 端的内容(不确定您是否在该语言领域做了很多工作?)
    • @KOL:我不会在这方面包括 anything,不。基本上,它只是对语言和核心库的介绍。
    猜你喜欢
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    相关资源
    最近更新 更多