获取'指针'类中的一个成员

本文关键字:成员 一个 指针 获取 | 更新日期: 2023-09-27 18:15:29

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

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
}

获取'指针'类中的一个成员

我会这样做。

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#中支持指针,但强烈反对

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

  MyClass mc2 = mc;

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

由于在注释中提到了访问器包装器方法,因此大致如下:

编辑

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
}

编辑之后,您的问题是布尔值是值类型的。因此,当您将值类型复制到另一个实例时,您获得的不是引用,而是值。如果你想改变Class中的值,你必须直接做。如果您有类的引用,应该很容易。

 LocalClass.a = false;

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

在您的情况下,我更愿意返回类的引用作为具有开关块的方法的结果,然后修改布尔属性。