【问题标题】:Setting properties with {} braces when instantiating实例化时使用 {} 大括号设置属性
【发布时间】:2011-06-10 15:38:24
【问题描述】:

任何人都知道为什么以下将无法编译? ID 的设置器应该对两个类都是私有的,那么为什么我们可以实例化 ClassA 而不能实例化 ClassB?

public class ClassA {
    public string ID { get; private set; }

    public void test() {
        var instanceA = new ClassA() { ID = "42" };
        var instanceB = new ClassB() { ID = "43" };
    }

    public class ClassB {
        public string ID { get; private set; }
    }
}

谢谢

【问题讨论】:

    标签: c# instantiation


    【解决方案1】:

    test()ClassA 的成员,因此它可以访问A 的私有成员(和setter)。它确实可以访问@ 的私有成员或setter 987654324@,因此 instanceB 上的错误而不是 instanceA 上的错误。

    有关私人成员的可访问性的更多信息,我鼓励您在相关问题上查看this answer

    【讨论】:

    • 感谢您的快速回答,直觉上我认为私有访问器限制了对实例本身的访问,而不是对同一类的任何对象的访问。是否有任何特定的 c# 关键字来实现这一点(实例级别“隐私”)?你知道其他编程语言中 private 具有我假设的含义吗?
    • @Erwin,我无法对其他语言进行智能评论(只能对 C# 进行智能评论)。我只想说这是一个信任问题。如果一个 type 不能被信任来正确处理它自己的内部,那么谁可以呢?
    • 我认为在 C++ 中你可以将一个类设置为朋友类,它可以访问另一个类的内部:en.wikipedia.org/wiki/Friend_class
    【解决方案2】:

    您的Test 方法位于Class A 中,因此可以访问。

    【讨论】:

      【解决方案3】:

      Class BClass A 内部,A 无法访问 B 的私有成员,只是因为组合。

      【讨论】:

        猜你喜欢
        • 2020-04-24
        • 2022-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多