为什么参数没有更新

本文关键字:更新 参数 为什么 | 更新日期: 2023-09-27 18:37:19

我有一个使用另一个类的类。

第一类有这个方法:

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的属性中获取更新的值。

我想知道为什么在第一个解决方案中枚举没有更新,因为如果可能的话,我想避免将枚举包装在类中。

为什么参数没有更新

但是,当在 clickButton I 中更改_myParameters的值时,在 MyClass2 的构造函数中作为参数传递的对象中不会更改。

不,不会的。该值是通过值传入的 - 两个变量(myParameter_myParameters)是自变量。对一个变量的更改不会影响另一个变量。这就是所有类型 C# 中的工作方式。

对于调用方可以看到的方法中参数的更改,您可以使用ref参数,但这在您的情况下是不可行的,因为您要更改最初通过参数填充的实例变量。

您可以将值包装在一个可变类中,将对此类实例的引用传递到 MyClass2 中,然后在 MyClass2 中更改对象 - 更改将在您的第一个类中看到,因为这将更改对象中的数据而不是 MyClass2 的实例变量。不过,很难知道这是否真的是一个好的解决方案,因为我们的背景很少 - 像MyClassmyMethod这样的名称,我们不知道这试图实现什么的更大图景。

在第一个解决方案中,类内枚举的值没有更改,因为枚举是一种值类型,并且以下行:

_myParameters = paramParameters;

复制了paramParameters_myParameters是一个完全独立的独立对象。

在第二个示例中,MyExchangeClass 是引用类型,因此以下行:

_mySelection= paramParameters;

_mySelection指出paramParameters所指的完全相同的对象。

从文档中:

基于值类型的变量直接包含值。将一个值类型变量分配给另一个值类型变量会复制包含的值。这与引用类型变量的赋值不同,后者复制对对象的引用,但不复制对象本身。

枚举是一种值类型,同上:

值类型由两个主要类别组成:

  • 结构体

  • 枚举