我知道如何使用属性,并且我知道它们隐式调用底层的get
和set
访问器,具体取决于我们是在写属性还是从属性读取。
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/