嵌套类,只有get属性

时间:2017-01-17 01:18:42

标签: c# class inner-classes

假设我有以下课程:

public class ClassA 
{
    public string ElementA { get; }
    public string ElementB { get; }
}

public class ClassB
{
    public ClassA ElementC = new ClassA()
    {
        ElementA = "Sample Value A",
        ElementB = "Sample Value B"
    };

    public ClassB ElementD = new ClassA()
    {
        ElementA = "Sample Value C",
        ElementB = "Sample Value D"
    };
}

我如何将ClassA嵌套在内部,并作为ClassB的元素,只有{ get; }属性。我试图实例化一个只能通过{ get; }评估者访问的类,因为我希望它表现为一个固定的变量/值。每当我尝试这种方法时,IDE(Visual Studio)都会抛出一个错误:

enter image description here

  

无法将属性或索引器“ClassA.ElementA”分配给它 - 它是   只读

将ClassA写成:

public class ClassA 
{
    public string ElementA { get; set; }
    public string ElementB { get; set; }
}

使ClassB的ClassA元素可编辑,但不会在IDE(Visual Studio)中抛出错误。

如何或是否可以做我的想法?感谢。

2 个答案:

答案 0 :(得分:2)

如下定义的属性:

public Foo Bar { get; }

等同于:

private readonly Foo bar;

public Foo Bar { get { return this.bar; } }

readonly关键字表示该字段只能在类的构造函数(或字段初始化列表中,在构造函数方法体之前执行)中指定。

由于该字段是私有的,因此您无法在类型的访问范围之外进行设置,并且因为它是readonly字段,因此它必须位于构造函数中 - 因此要使用外部 - 提供的值必须使用构造函数参数:

public ClassA(Foo value) {
    this.Bar = value;
}

答案 1 :(得分:2)

如果您不希望从类外部修改属性,请添加私有setter并修改类的构造函数以在实例化时设置值:

public class ClassA 
{
    public ClassA(string elementA, string elementB)
    {
        ElementA = elementA;
        ElementB = elementB;
    }

    public string ElementA { get; private set; }
    public string ElementB { get; private set; }
}

然后从ClassB像这样实例化它:

public class ClassB
{
    public ClassA ElementC = new ClassA("Sample Value A", "Sample Value B");
}