c# - 这不会破坏拥有只读属性的全部目的吗?

标签 c# properties

我知道如何使用属性并且我知道它们隐式调用底层 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成员并改变他们的值(value)观。

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

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

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

谢谢

最佳答案

不可变性是不可传递的;您不能指望将可变对象放入不可变访问器中是不可变的。

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

相关文章:

c# - 使用 Entity Framework ,返回 DateTime 列的日期端口等于今天的所有行

maven-2 - 如何根据我的个人资料更改 maven 中的 .properties 文件?

Objective-C 类方法 : dot syntax and 'class property'

c# - 如何检查字符串中的第一个字符是否为项目符号(ASCII 中不存在)

c# - 为什么 LINQ Where 搜索查询在 List<> 上比 ConcurrentBag<> 更快

c# - 当我运行我的 C# 应用程序时,Visual Studio 报告它加载了一个托管二进制文件(看起来像)一个随机生成的名称

c# - 覆盖等于运算符

qt - QML:当后一种方法具有优势时,是否有任何理由设置上下文属性而不是在根对象上设置属性?

python - 在 SQLAlchemy 中查询混合属性

properties - 未调用 Swift 中的访问器方法