我知道如何使用属性,并且我知道它们隐式调用底层的getset访问器,具体取决于我们是在写属性还是从属性读取。

static void Main(string[] args)
{
    A a = new A();
    (a.b).i = 100;

}

class A
{
    private B _b = new B();
    public B b
    {
        get { return _b; }
    }
}
class B
{
    public int i;
}
(a.b).i = 100;实质上执行的代码是,第一个属性的get访问器返回对对象_b的引用,一旦有了该引用,我们就可以访问_b’s成员并更改其值。

因此,在我们的示例中,具有只读属性只能防止外部代码更改引用变量_b的值,但不能阻止外部代码访问_b’s成员。

因此,似乎该属性只能检测我们是否尝试读取或写入位于堆栈上的变量(在我们的示例中为_b变量),而无法检测是否我们正在尝试同时写入一个数组的成员。堆栈上的变量(假定此变量是引用类型)指向的对象。

a)但是,这难道不克服拥有只读属性的全部目的吗?如果属性还能够检测我们是否正在尝试访问由get访问器返回的对象的成员(假设后备字段是引用类型),这会更有效吗?

谢谢你

最佳答案

想象一个像这样的类(class):

public class A
{
    private List<int> _myList<int> = new List<int>();
    public List<int> MyList { get { return _myList; } }
}

现在,该类的用户可以添加,删除和访问列表中的项目,但是他们不能替换列表本身。这个很重要。例如,它允许您在类内部进行操作,例如假设_myList成员从不为null。

用一种更通用的方式,该范例允许您在类中定义一个接口(interface),以便用户可以在您公开的属性中使用类型,但他们不能只是从您的下层交换掉复杂类型的实例。

关于c# - 这不会破坏拥有只读属性的全部目的吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3056428/

10-14 10:30
查看更多