2013-04-09 189 views
4

這是我的。有沒有辦法從靜態方法調用非靜態方法?

public static void Person_home_phone_TextChanged(object sender, EventArgs e) { ... } 

有沒有什麼辦法從這個靜態方法內部訪問同一個或另一個類的非靜態方法?

我需要抓取Person_home_phone文本框中的文本並將其保存到類數據成員。

+3

當然,您可以從靜態方法中調用非靜態方法。你爲什麼認爲你不能? * Main *是一個靜態方法,顯然你必須能夠從靜態方法中調用非靜態方法。 –

+0

可能的重複:http://stackoverflow.com/questions/1360183/how-do-i-call-a-non-static-method-from-a-static-method-in-c – Geoff

+3

只需要替換你的省略號。 ''與'sender.ToString();'。由於'ToString'是一種非靜態方法,因此您已經成功地「訪問」了一個! –

回答

13

例() - >例

你只需要創建type的一個實例,然後調用non-static,從static方法。

public class Example(){ 

    public static void StaticExample() 
    { 

     Example example = new Example(); 
     example.NonStatic(); 
    } 

    public void NonStatic() 
    { 

    } 

} 
+0

如果類是System.Web.UI.Page類型,該怎麼辦?或System.Web.UI.UserControl?我們可以得到它的一個實例嗎? –

+0

假設被調用的方法由窗體類擁有,這意味着我每次調用該方法時都必須實例化一個窗體的新實例? –

7

您需要有一個類的實例來調用非靜態方法。

0

您應該有一個對象來訪問它的方法。

靜態不屬於對象。它們屬於類聲明。

0

只能在該類的實例的上下文中調用實例方法(非靜態)。所以你可以調用它,但是你必須在你的靜態方法的某個地方有一個該類的對象。

0

非靜態方法需要類的一個實例。除非你傳入了一個實例,或者在你的方法中創建了一個實例,否則你不能調用非靜態方法,因爲你不知道該方法應該運行哪個類的實例。

您需要一個類類的實例來調用非靜態方法。

0

解決方案#1: 每次調用方法時,都會實例化Car的新實例。

public static void DoSomething() 
     { 
      Car c = new Car(); 
      c.NonStaticMethod(); 
     } 

溶液#2: 傳遞一個汽車的方法。

public static void DoSomething(Car c) 
     { 
      c.NonStaticMethod(); 
     } 

解決方案3:

使用單車,以支持靜態方法。 (如果從多個線程調用是一個可能性,你可能還需要鎖定。需要注意的是System.Windows.Forms.Timer不會引入一個線程。)

public class Car 
    { 
     private static Car m_Singleton = new Car(); 

     public static void DoSomething() 
     { 
      m_Singleton.NonStaticMethod(); 
     } 

請注意,你有沒有用定時器說明你的內存問題。這個潛在問題很可能有解決方案。