C# 如何防止直接访问类中的变量?

C# 如何防止直接访问类中的变量?,c#,C#,在我的类中,我有一个私有变量,我只通过get/set在类中使用它。有时我忘记了,我不应该直接使用变量(,即使在类中也是如此),而必须使用get/set 如何使之成为使用变量的唯一方法是get/set public class A { int x; public XVariable { get { return x; } set { x = value } // some additional operations }

在我的类中,我有一个私有变量,我只通过get/set在类中使用它。有时我忘记了,我不应该直接使用变量(,即使在类中也是如此),而必须使用get/set

如何使之成为使用变量的唯一方法是get/set

public class A {
    int x;

    public XVariable {
        get { return x; }
        set { x = value }

        // some additional operations
    }

    void SomeMethod() {
        x = 5; // no
        XVariable = 5; // yes
    }
}
C#has。代码中不需要支持字段

public class A {
    public XVariable {
        get;
        set;
     }
}
也可以使用不同的访问修饰符。比如,如果您只想在类中设置它

public class A {
    public XVariable {
        get;
        private set;
     }
}
代码中没有可访问的支持字段,但编译器将在MSIL中生成一个支持字段(C#编译到的内容)。不过你不必担心那部分


自动道具的一个潜在缺点是,有时在设置某些内容时,需要在属性中执行其他操作(尤其是事件处理程序)。但这是不可能与自动道具。在这种情况下,他的回答更为恰当。但是,如果您的用例不关心这个问题,那么我的答案就足够了。

您可以创建一个基类,并在派生类中完成所有实际工作:

public class SomeBaseClass {
    private int _x;
    public int X { get { return _x; } set { _x = value; } }
}

public class DerivedClass : SomeBaseClass {
    void DoSomething() {
        // Does not have access to _x
    }
}

许多人在其私有变量前加下划线,以帮助表示该变量是私有的。(虽然这是一个意见问题,但有些人喜欢,有些人不喜欢)对这个问题有更多的见解

可以但是,废弃该字段并使用一个


自动属性将存储一个匿名备份字段“在视图之外”。

从技术上讲,它仍然会生成备份字段,但至少您不能在代码中设置:)@BradleyDotNET如果您不能触摸它,它就不存在!但是,是的,重点是,我会用解释更新答案。可能有人希望使用字段和常规属性的一个潜在原因是,在getter和setter中可以有更多的“东西”,比如事件处理程序或其他有副作用的东西-这就是他们不想直接访问字段的原因,这是一个更好的答案,因为它直接解决了这个问题。当您需要执行比简单字段可见性更高级的操作时,也可以使用其他版本(您自己定义支持字段)。
public XVariable { get; set; }