2009-07-24 133 views
22

我听不太懂用下面的代码的根本错误:非静态类中静态方法的要点是什么?

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?"); 

这会说我不能在非静态上下文,但测试和主要是静态的,什么是它指的是访问静态方法?

+0

见`XmlReader.Create`作为非静态类中静态方法的一个例子。 – 2009-07-24 19:53:51

回答

21

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

myOtherClass.print("vhhhat?"); 

这不是一成不变的,当你创建了一个名为moc类的一个实例:当你调用一个方法

myOtherClass moc = new myOtherClass(); 
0

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

11

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

3

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

例如,工厂方法:

SomeClass obj = SomeClass.CreateInstance(); 

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

8

首先,错误:

moc.print("vhhhat?"); 

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

myOtherClass.print("vhhhat?"); 

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

0

正确的程序应该是: -

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"); 


    } 
} 
相关问题