我一直在尝试简单的实验来学习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的情况下调用方法但我必须使用它?
谢谢!
答案 0 :(得分:8)
在他们的示例中,他们正在创建Program
的实例,并在该实例上调用方法:
(new Program()).run();
这更清晰地写成:
Program program = new Program();
program.run();
在这些实例方法中,您可以调用其他实例方法,因为您在this
上隐式调用它们。
顺便说一句,如果真的是书中的示例代码,我建议你得到一本不同的书:那里有一些非常值得怀疑的风格方面。特别是:
private
是明确的还是隐含的ReadInt32
代替readInt
。同样,它对于私人方法并不重要,但进入double
用于货币值是非常糟糕的主意 p
的参数名称不提供任何信息(在不同的地方,用于不同的含义)TryParse
而不是Parse
,然后检查返回值,然后在错误输入时重新提示