2009-07-24 138 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"); 


    } 
} 
相關問題