0

我有几个类,想根据开关更改特定类的特定实例中的布尔值,但似乎无法获得指向该值的“指针”,我只是得到一个副本。

Class aClass;
Class bClass;
Class cClass;

public class Class
{
    public bool b = true;
    ...
}

void Method(int i)
{
    bool localBool;

    switch(i)
        case 1:
            localBool = aClass.b;
            break;
        case 2:
            localBool = bClass.b;
            break;
        case 3:
            localBool = cClass.b;
            break;

    localBool = false; // This changes the localBool, but not Class.b
}

编辑:如果我在班级中有 3 个布尔值而不是 3 个班级怎么办?

Class aClass;

public class Class
{
    public bool a = true;
    public bool b = true;
    public bool c = true;
    ...
}

void Method(int i)
{
    bool localBool;

    switch(i)
        case 1:
            localBool = aClass.a;
            break;
        case 2:
            localBool = aClass.b;
            break;
        case 3:
            localBool = aClass.c;
            break;

    localBool = false; // This changes the localBool, but not aClass.Bool
}
4

5 回答 5

5

我会这样做。

void Method(int i)
{
    Class local;

    switch(i)
        case 1:
            local = aClass;
            break;
        case 2:
            local = bClass;
            break;
        case 3:
            local = cClass;
            break;

    local.b = false;
}

顺便说一句,支持 C# 中的指针,但强烈建议不要这样做。只有在没有其他方法时才应使用它们。

于 2013-05-24T20:33:35.977 回答
2

unsafeC#中没有上下文之外的指针。类是引用类型,所以当你做一些事情时,MyClass mc = new MyClass();你会得到最接近 C# 中的指针。就我而言,两者在概念上是相同的,只是在 C# 中,运行时/编译器消除了大部分潜在的错误。如果我要做类似的事情,继续我的例子;

  MyClass mc2 = mc;

然后mc2也将引用与 相同的内存mc。更进一步。如果我然后去mc2.MyBool = false;了,那么if (mc.MyBool)它不会满足条件,因为我刚刚更改了同一个对象上的布尔值。如果您习惯于在 c++ 中处理指针和对象,那么这种行为正是您所期望的。

于 2013-05-24T20:33:47.087 回答
2

因为在评论中提到了访问器包装方法,所以大致如下所示。

编辑

void Method(int i)
{
    Action<bool> localBool = null;

    switch(i)
        case 1:
            localBool = v => aClass.b = v;
            break;
        case 2:
            localBool = v => bClass.b = v;
            break;
        case 3:
            localBool = v => cClass.b = v;
            break;

    localBool(false); // This changes the localBool, and Class.b
}
于 2013-05-24T21:00:22.873 回答
0

编辑后,您的问题是布尔值是值类型的。因此,当您将值类型复制到另一个实例时,您不会获得引用,而只是获得值。如果要更改 Class 中的值,则必须直接进行。如果您有对该类的引用,那应该很容易。

 LocalClass.a = false;
于 2013-05-24T20:44:53.857 回答
0

.net 包含两种类型:引用类型和值类型。类、字符串等是引用类型。Int、DateTime、boolean 等都是值类型。这些类型之间有很多区别。在您的情况下,最重要的 - 将值类型的值分配给变量将复制该值。这就是为什么你的 localBool 它只是另一个具有一定价值的自变量。所有修改都不会更改类中的值。

在您的情况下,我宁愿返回对类的引用作为 Method with switch 块的结果,然后修改布尔属性。

于 2013-05-24T20:45:21.513 回答