非静态类中静态方法的要点是什么?
我听不太懂用下面的代码的根本错误:非静态类中静态方法的要点是什么?
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?");
这会说我不能在非静态上下文,但测试和主要是静态的,什么是它指的是访问静态方法?
静态类意味着您不能在非静态上下文中使用它,这意味着您不能在该类的对象实例化并调用该方法。如果你想用你的打印方法,你必须做的:
myOtherClass.print("vhhhat?");
这不是一成不变的,当你创建了一个名为moc
类的一个实例:当你调用一个方法
myOtherClass moc = new myOtherClass();
在对象实例上,您正在非静态上下文中调用它。你做这件事的方法并不重要。
This will say I can't access static method in non static context but Test and main are static, what is it referring to ?
这是指使用实例(moc)引用静态方法(myOtherClass.print)的事实。你将不得不重做这个:
myOtherClass.print("vhhhat?");
这将正确编译。
静态方法是针对类本身的方法,而不是类的特定实例。这有很多用途 - 一个例子是实施Factory method pattern。
某些时候,函数的“目标”是特定于类而不是对象(类的实例)。
例如,工厂方法:
SomeClass obj = SomeClass.CreateInstance();
这是更加明显,当语言具有元编程设施,其允许在类操作。在Python中,根据约定,这种区别更加明确:传递给函数的第一个参数要么被命名为“cls”或“self”,并且指示该函数可能对该类进行操作(当它是“类方法”时)或者实例(当你是一个实例方法时,你更习惯的类型)。
首先,错误:
moc.print("vhhhat?");
试图调用一个静态方法的类的一个实例(即非静态上下文)。要正确调用print(),你会做
myOtherClass.print("vhhhat?");
对于第一个问题,有很多原因,在非静态类的静态方法。基本上,如果有一个与该类相关的操作,但没有与该类的任何特定实例关联,则应该是一个静态方法。例如,String。Format()(或任何String静态方法)不应该在字符串实例上操作,但它们应该与String类关联。因此它们是静态的。
正确的程序应该是: -
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");
}
}
见`XmlReader.Create`作为非静态类中静态方法的一个例子。 – 2009-07-24 19:53:51