我无法通过以下代码了解潜在的错误:
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不会抛出异常错误。
此外,
moc.print("vhhhat?");
这就说我不能在非静态上下文中访问静态方法但是Test和main是静态的,它指的是什么?
答案 0 :(得分:22)
静态类意味着您不能在非静态上下文中使用它,这意味着您不能拥有该类的对象实例化并调用该方法。如果你想使用你的打印方法,你必须这样做:
myOtherClass.print("vhhhat?");
这不是静态的,因为您创建了一个名为moc
的类的实例化:
myOtherClass moc = new myOtherClass();
答案 1 :(得分:12)
这就说我不能在非静态上下文中访问静态方法但是Test和main是静态的,它指的是什么?
这是指您使用实例(moc)引用静态方法(myOtherClass.print)的事实。你必须重做这个:
myOtherClass.print("vhhhat?");
这将正确编译。
静态方法是对类本身起作用的方法,而不是类的特定实例。这有很多用途 - 一个例子是实现Factory method pattern。
答案 2 :(得分:9)
首先,错误:
moc.print("vhhhat?");
尝试在类的实例上调用静态方法(即非静态上下文)。要正确调用print(),您可以执行
myOtherClass.print("vhhhat?");
对于第一个问题,有很多理由在非静态类中使用静态方法。基本上,如果存在与该类关联的操作,但没有与该类的任何特定实例相关联,则它应该是静态方法。例如,String.Format()(或任何String静态方法)不应对字符串实例进行操作,但它们应与String类关联。因此它们是静态的。
答案 3 :(得分:3)
有时函数的“目标”特定于类而不是对象(类的实例)。
例如,工厂方法:
SomeClass obj = SomeClass.CreateInstance();
当语言具有允许对类进行操作的元编程工具时,这一点更加明显。在Python中,这种区别按惯例更明确:传递给函数的第一个参数或者命名为“cls”或“self”,并指示函数可以对类进行操作(当它是“类方法”时)或实例(当你的实例方法时,你更习惯的类型)。
答案 4 :(得分:1)
这是一个很好的例子,说明何时在非静态类中使用静态方法:
答案 5 :(得分:1)
正确的计划是: -
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");
}
}
答案 6 :(得分:0)
当您在对象实例上调用方法时,您在非静态上下文中调用它。使用哪种方法并不重要。