2012-09-25 71 views
-3

我只是好奇,這是如何工作: 在我的課Form1.cs中我已聲明的對象靜態:C#對象仍然存在刪除其引用後

public static Class1 class1; 

這是Class 1的構造的樣子:

public Class1() 
{ 
    Form1.class1 = null; 
} 

我希望得到一個空引用異常的MS VS 2010

class1 = new Class1(); 
class1.showMSG(); 

卜t代替它只是執行showMSG()(showMSG不是靜態的),就像我從未將對class1的引用設置爲null。 對此有何想法?

+0

您分配一個值調用showMSG ... –

+0

你將永遠不會從該得到一個空引用EXCP之前CLASS1。因爲您在使用新關鍵字時正在創建對象。這是基本的基礎。 – pordi

+0

相反,如果你想產生一個空引用異常,那麼你可能想嘗試使用沒有新關鍵字的類。 – pordi

回答

1

1類的構造函數設置

Form1.class1 = null; 

但是,當你執行

class1 = new Class1(); 

分配給class1(這是同class1)發生的構造函數執行後。所以Form1.class1現在有一個值。

+1

@OP您需要將'class1 = new Class1();'看作幾個不同的操作,而不是一個原子操作。首先使用'new Class1()'創建'Class1'的新實例,然後運行該對象的構造函數(將'class1'設置爲'null'),然後將該新創建的對象分配給'class1'。一旦你像這樣分解它,很明顯爲什麼arx的答案是正確的。 – Servy

+0

@Servy,但一旦class1有一個值,是不是仍然只是* null *? – Thousand

+1

@JaneDoe不,它不是null,它是新創建的'Class1'對象,它是從'new Class1()'返回的' – Servy

4

那麼,根據所提供的代碼,你在這裏實際上初始化了它class1 = new Class1();

你首先將它設置爲null

Form1.class1 = null; 

class1 = new Class1(); //INIT THE SAME (ACCORDING TO THE NAME) OBJECT 
    class1.showMSG();  //CALL A METHOD ON IT. 

編輯

根據編輯問題:

public Class1() 
{ 
    Form1.class1 = null; 
} 

因爲你仍然一個constructor,在退出它實際上對象將構造並分配給您之前分配null相同的對象不復位任何東西。

+0

不正確。 'class1'在**'class1 = new Class1();之前設置爲null **''設置'class1'爲新創建的實例。 – Servy

+0

@Servy:和?這個新實例讓我們來OP實際調用一個實例方法。 – Tigran

+0

@Servy:好的,更正INSTANCE - > OBJECT。 – Tigran

1

也許這是最簡單的,如果你打破了你的最後兩行解釋,成:

var tmp = new Class1(); // makes class1 null 
class1.showMSG();  // would raise exception, remove this line to proceed 
class1 = tmp;   // class1 is no longer null 
class1.showMSG();  // no exception, instance exists to call method on 
相關問題