2013-10-28 228 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

  • 枚举

相关问题