非静态类中静态方法的重点是什么?

我无法通过以下代码了解潜在的错误:

class myClass { public void print(string mess) { Console.WriteLine(mess); } } class myOtherClass { public static void print(string mess) { Console.WriteLine(mess); } } public static class Test { public static void Main() { myClass mc = new myClass(); mc.print("hello"); myOtherClass moc = new myOtherClass(); moc.print("vhhhat?"); //This says I can't access static method in non static context, but am I not? } } 

我永远不会想到为什么会在非静态类中声明静态方法的原因,那么为什么.NET不会抛出exception错误。

此外,

 moc.print("vhhhat?"); 

这将说我无法在非静态上下文中访问静态方法,但Test和main是静态的,它指的是什么?

静态类意味着您不能在非静态上下文中使用它,这意味着您不能拥有该类的对象实例化并调用该方法。 如果你想使用你的打印方法,你必须这样做:

 myOtherClass.print("vhhhat?"); 

这不是静态的,因为您创建了一个名为moc的类的实例化:

 myOtherClass moc = new myOtherClass(); 

这将说我无法在非静态上下文中访问静态方法,但Test和main是静态的,它指的是什么?

这是指您使用实例(moc)引用静态方法(myOtherClass.print)的事实。 你必须重做这个:

 myOtherClass.print("vhhhat?"); 

这将正确编译。

静态方法是对类本身起作用的方法,而不是类的特定实例。 这有很多用途 – 一个例子是实现Factory方法模式 。

一,错误:

 moc.print("vhhhat?"); 

试图在类的实例上调用静态方法(即非静态上下文)。 要正确调用print(),你会这样做

 myOtherClass.print("vhhhat?"); 

对于第一个问题,有很多理由在非静态类中使用静态方法。 基本上,如果存在与该类关联的操作,但不与该类的任何特定实例相关联,则它应该是静态方法。 例如,String.Format()(或任何String静态方法)不应对字符串实例进行操作,但它们应与String类关联。 因此它们是静态的。

有时,函数的“目标”特定于类而不是对象(类的实例)。

例如,工厂方法:

 SomeClass obj = SomeClass.CreateInstance(); 

当语言具有允许对类进行操作的元编程设施时,这一点更加明显。 在Python中,这种区别按惯例更加明确:传递给函数的第一个参数或者命名为“cls”或“self”,并指示函数可以在类上运行(当它是“类方法”时)或实例(当你是一个实例方法时,你习惯的类型)。

这是一个很好的例子,说明何时在非静态类中使用静态方法:

ASP.NET AJAX回调到ASPX页面中的Web方法

正确的计划是: –

 class myClass { public void print(string mess) { Console.WriteLine(mess); } } class myOtherClass { public static void print(string mess) { Console.WriteLine(mess); } public void printMe(string mess) { Console.WriteLine(mess); } } public static class Test { public static void Main() { myClass mc = new myClass(); mc.print("hello"); myOtherClass moc = new myOtherClass(); myOtherClass.print("vhhhat?"); moc.printMe("test me"); } } 

对象实例上调用方法时,您在非静态上下文中调用它。 你这样做的方法并不重要。