【问题标题】:Nested Class with get only property具有仅获取属性的嵌套类
【发布时间】:2017-01-17 01:18:42
【问题描述】:

假设我有以下课程:

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 内部并作为 ClassB 的一个元素,只有一个 { get; } 属性。我正在尝试实例化一个只能通过{ get; } 评估器访问的类,因为我希望它表现为固定变量/值。每当我尝试这种方法时,IDE(Visual Studio)都会向我抛出一个错误:

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

将 ClassA 写为:

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

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

如何或有可能实现我的想法?谢谢。

【问题讨论】:

  • 试试构造函数?

标签: c# class inner-classes


【解决方案1】:

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

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");
}

【讨论】:

  • 这回答了我的问题。谢谢@Grant!
  • 从 C# 6 开始,您不需要添加私有 setter。
【解决方案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;
}

【讨论】:

  • 很好解释。会牢记这一点,并将其保存以供我将来参考。谢谢@戴!
猜你喜欢
  • 2019-04-10
  • 1970-01-01
  • 2021-07-15
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 2019-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多