我听不太懂用下面的代码的基本错误:
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();
这会说我不能在非静态上下文,但测试和主要都是静态访问静态方法,什么是它指的是?
这是指您正在使用引用的实例(MOC)一个静态方法(myOtherClass.print)的事实。 你将不得不返工这是:
myOtherClass.print("vhhhat?");
这将正确编译。
静态方法是在类本身,而不是类的特定实例的工作方法。 这有很多用途-一个例子是实现了工厂方法模式 。
首先,错误:
moc.print("vhhhat?");
试图调用静态方法的类(即非静态上下文)的实例。 要正确调用print(),你会怎么做
myOtherClass.print("vhhhat?");
对于第一个问题,有很多原因,在非静态类的静态方法。 基本上,如果不存在与类相关联,但不与类的任何特定实例的操作中,它应该是一个静态方法。 例如,的String.Format()(或任何的字符串静态方法),不应该对字符串实例操作,但是它们应与String类相关联。 因此,他们是静态的。
有时该函数的“客观”是特定的类,而不是对象(类的实例)。
例如,工厂方法:
SomeClass obj = SomeClass.CreateInstance();
这是更加明显,当语言具有的元编程工具,允许类上操作。 在Python中,这种区别是按照约定更加明确:传递给函数的第一个参数是名为类似“CLS”或“自我”,并表示该功能可在类工作(当它是一个“类方法”)或实例(你比较习惯的类型,当它是一个实例方法)。
下面是当你将使用在非静态类的静态方法一个很好的例子:
ASP.NET AJAX回调到Web方法在ASPX页面
正确的程序是: -
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");
}
}
当您在一个对象实例调用方法,则需要在非静态上下文中调用它。 这是没有意义的哪种方法你做到这一点。