2013-10-28 165 views
1

我有一個使用另一個類的類。爲什麼參數沒有更新?

第一類有這樣的方法:

public void myMethod() 
{ 
    //Parameters are an enumeration. 
    // Really is a exchange variable between this class 
    //and the other class. 
    Paramters myParameter = Parameters.Option1; 

    MyClass2 myOtherClass = new MyClass2(myParameter); 
} 

第二類:

public enum Parameters { Option1, Option2, Option3 } 

MyClass2 
{ 
    Parameters _myParameters; 

    Public MyClass2(Parameters paramParameters) 
    { 
     _myParameters = paramParameters; 
    } 

    private void clickButton() 
    { 
     _myParameters = Parameters.Option2; 
     this.Dispose(); 
    } 
} 

我它是什麼創造一個對話和Parameters是一個枚舉是擔任之間的交流主窗口和對話框來通知對話框中的選擇。

但是,如果在clickButton中更改_myParameters的值,則在MyClass2的構造函數中作爲參數傳遞的對象中的值不會更改。

如果不是使用枚舉作爲交換變量,而是創建一個枚舉類,那麼我可以得到選擇。交換類將是這樣的:

class MyExchangeClass 
{ 
    Parameters myOption; 
} 

然後代碼將是:

public void myMethod() 
{ 
    //Parameters are an enumeration. 
    // Really is a exchange variable between this class 
    //and the other class. 
    MyExchangeClass mySelection= new MyExchangeClass(); 

    MyClass2 myOtherClass = new MyClass2(mySelection); 
} 

第二類:

public MyExchangeClass 
{ 
    Parameters enum MySelection { Option1, Option2, Option3 } 
} 

class MyClass2 
{ 
    MyExchangeClass _mySelection; 

    Public MyClass2(MyExchangeClassparamParameters) 
    { 
     _mySelection= paramParameters; 
    } 

    private void clickButton() 
    { 
     _mySelection.MySelection = Parameters.Option2; 
     this.Dispose(); 
    } 
} 

這樣的Class1,在主窗口中,獲取class MyExchangeClass屬性中的更新值。

我想知道爲什麼在第一個解決方案中枚舉沒有更新,因爲如果可能的話,我想避免需要在一個類中包裝枚舉。

+1

是您的clickButton連接到按鈕?它似乎並不是 – Jonesopolis

+0

以及點擊按鈕它是爲了顯示_MySelection被更新,這是一個Class2的類變量,但它似乎不是與構造函數的參數相同的變量,儘管已被賦值在構造函數上。 –

回答

5

但是,當在clickButton中更改_myParameters的值時,在作爲MyClass2的構造函數中的參數傳遞的對象中沒有更改。

不,它不會。該值通過值傳遞 - 兩個變量(myParameter_myParameters)是獨立變量。對一個變量的更改不會影響其他變量。這是所有類型在C#中的工作方式。

一種方法內更改參數由主叫方可以看出,你可以使用一個ref參數,但是這並不可行,你的情況爲你改變它最初是通過填充的實例變量一個參數。

你可以在一個可變類包裝的價值,傳遞給類的一個實例的引用爲MyClass2,然後變異內MyClass2對象 - 變化將你的第一類中可以看出,因爲那將是更改對象內的數據而不是實例變量MyClass2。很難知道這是否是一個好的解決方案,但由於我們的背景很少 - 像MyClassmyMethod這樣的名稱,我們不知道這是什麼試圖實現的大局。

2

在你的第一個解決方案類中枚舉的值並沒有改變,因爲枚舉是value type,而這條線:

_myParameters = paramParameters; 

paramParameters_myParameters副本是一個完全獨立的,獨立的目的。

在第二個例子中,MyExchangeClassreference type,所以這行:

_mySelection= paramParameters; 

_mySelection製成指向完全相同paramParameters參考指的是相同的對象。

documentation:是基於值類型直接包含值

變量。將一個值類型變量賦值給另一個複製包含的值。這與引用類型變量的賦值不同,後者將引用複製到對象而不是對象本身。

而枚舉是值類型,ibidem:

的值類型包括兩個主要類別:

  • 的Structs

  • 枚舉

相關問題