问题:
class Program
{
public void Greet(string name) //动态方法
{
Console.WriteLine("早上好," + name);
}
static void Main(string[] args) //静态方法
{
Greet("bobo"); //报错:对象对于非静态的字段、方法或属性“Program.Greet(string)”是必需的
}
}
如上例所示,主函数Main函数为静态方法,当在其方法内部直接调用本类Program中的动态方法Greet时,编辑器会报错提示 :
对象对于非静态的字段、方法或属性“Program.Greet(string)”是必需的**
意思是静态方法中不能直接引用动态方法,为什么呢???
解析
首先我们需要搞清楚静态方法和动态方法的区别:
静态方法是类的成员,创建后储存在内存中,占内存,但调用速度块,又叫类方法
动态方法不是类的成员,要调用必须先声明类的实例(也就是new一个类)后,通过类的实例调用,调用完后,立即释放类,节省内存。
此例中静态方法main不能在自己的方法中直接调用本类中的动态方法Greet,我们可以想想如果系统允许调用,会发生什么:
如果静态方法Main中可以直接调用动态方法Greet,当Program类外部的一个类,通过Program直接调用Main(因为Main是静态方法,可以通过当Program类调用),也就相当于可以调用静态方法Main中的动态方法Greet了,而不需要对类进行实例化,这种调用在系统运行时也会报异常,因此为防止更多异常发生,系统选择在编译阶段一开始就禁止使用此种调用,提前发现并规避错误。
方案
问题的原因已经搞明白了,解决方案也就不言而喻了,当我们想要在静态方法中调用动态方法时,需要对类进行实例化,再通过类来调用
代码如下:
class Program
{
public void Greet(string name) //动态方法
{
Console.WriteLine("早上好," + name);
}
static void Main(string[] args) //静态方法
{
new Program().Greet("bobo");
}
}
或者本例中就是要调用Greet方法,也可将Greet方法改为静态方法,就可以直接进行调用了
代码如下:
class Program
{
public static void Greet(string name) //改为静态方法
{
Console.WriteLine("早上好," + name);
}
static void Main(string[] args) //静态方法
{
Greet("bobo"); //直接调用
}
}
上述讲了静态方法,静态变量和属性的原理与方法类似