我有一个使用另一个类的类。
第一堂课有这个方法:
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
属性中的更新值。
我想知道为什么在第一个解决方案中枚举没有更新,因为如果可能的话,我想避免将枚举包装在一个类中。
答案 0 :(得分:5)
但是,当在clickButton中我更改_myParameters的值时,在MyClass2的构造函数中作为参数传递的对象中没有更改。
不,它不会。值是按值传递的 - 两个变量(myParameter
和_myParameters
)是独立变量。对一个变量的更改不会影响另一个变量。这就是所有类型在C#中的工作方式。
对于调用者可以看到的方法中参数的更改,您可以使用ref
参数,但在您更改<<}时,这不可行em> instance 变量,最初是通过参数填充的。
您可以将值包装在可变类中,将对该类实例的引用传递给MyClass2
,然后在MyClass2
- 中改变该对象更改将在您的第一个类中看到,因为这将改变对象内的数据而不是MyClass2
的实例变量。很难知道这是否真的是一个很好的解决方案,因为我们的上下文很少 - 有MyClass
和myMethod
这样的名字我们不知道这是怎么回事实现
答案 1 :(得分:2)
在你的第一个解决方案中,类中枚举的值没有改变,因为枚举是value type,而这一行:
_myParameters = paramParameters;
制作了paramParameters
的副本,而_myParameters
是一个完全独立的独立对象。
在第二个示例中,MyExchangeClass
是reference type,所以这一行:
_mySelection= paramParameters;
使_mySelection
指向与paramParameters
引用完全相同的对象。
基于值类型的变量直接包含值。将一个值类型变量分配给另一个值复制包含的值。这与引用类型变量的赋值不同,后者复制对象的引用而不是对象本身。
枚举是一种值类型,ibidem:
值类型包含两个主要类别:
的Structs
枚举