获取类中成员的“指针”

时间:2013-05-24 20:31:17

标签: c# pointers

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

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
}

5 个答案:

答案 0 :(得分: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#中的指针,但强烈不鼓励。它们只应在没有其他方式时使用。

答案 1 :(得分:2)

C#中的unsafe上下文之外没有指针。类是引用类型,所以当你执行MyClass mc = new MyClass();这样的事情时,你得到的就是C#中的指针。就我而言,这两者在概念上是相同的,只是在C#中,运行时/编译器消除了很多错误的可能性。如果我要做的话,继续我的例子;

  MyClass mc2 = mc;

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

答案 2 :(得分: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
}

答案 3 :(得分:0)

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

 LocalClass.a = false;

答案 4 :(得分:0)

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

在你的情况下,我宁愿返回带有switch块的方法的类引用,之后修改boolean属性。