Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有get only属性的嵌套类_C#_Class_Inner Classes - Fatal编程技术网

C# 具有get only属性的嵌套类

C# 具有get only属性的嵌套类,c#,class,inner-classes,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 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)都会抛出一个错误,其中指出:

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

将ClassA编写为:

public class ClassA 
{
    public string ElementA { get; set; }
    public string ElementB { get; set; }
}
使ClassB的ClassA元素可编辑,但不会在IDE(Visual Studio)中引发错误


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

定义如下的属性:

public Foo Bar { get; }
public class ClassB
{
    public ClassA ElementC = new ClassA("Sample Value A", "Sample Value B");
}
相当于:

private readonly Foo bar;

public Foo Bar { get { return this.bar; } }
readonly
关键字表示只能在类的构造函数(或在构造函数方法主体之前执行的字段初始化列表)中分配字段

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

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

如果不希望从类外部修改属性,请添加私有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 Foo Bar { get; }
public class ClassB
{
    public ClassA ElementC = new ClassA("Sample Value A", "Sample Value B");
}

试试构造器?这回答了我的问题。谢谢你@Grant!从C#6开始,您不需要添加私有setter。我会记住这一点,并将其保存以备将来参考。谢谢你@Dai!