C#只读获取访问器

时间:2018-08-14 20:00:56

标签: c# get readonly accessor

代码:- (注意:-这里我使用的是只读字,表示该属性仅具有访问器。)

Class Test
{
    public List<string> list {get;}
    public string name{get;}

    public Test ()
    {
       list =new List<string>();
    }
}

Main()
{
    Test test =new Test();
    test.list.add("c#"); //no error 
    test.name="Jhon"; //here I get compilation because property name is read-only
}

如果您看到上面的代码段。测试类包含两个属性,即name和list。在main方法中,我正在创建测试类的对象以访问这些属性。因此,如果您看到我是否尝试将值设置为name属性,则将收到编译错误,因为name属性是只读的。同样,如果您看到另一个属性“列表”,如果我使用List类的add属性,它也是只读的,那么我可以在没有错误的情况下添加列表。  所以我不知道这是怎么发生的。

4 个答案:

答案 0 :(得分:0)

这是因为set是指设置集合的实际实例List object List本身返回时不是只读的。如果您希望它是只读的,则可以执行以下操作:

private List<string> list;

public ReadOnlyCollection<string> List {get => list.AsReadOnly()}

答案 1 :(得分:0)

您对“只读”属性的工作方式有误解。

如果您的代码如下所示:

Test test = new Test();
test.list.Add("c#"); //no error because you are not 'setting' the object
test.list = new List<string>(); //Error here because you ARE setting the object

Add()只是List<T>的一种方法,您正在修改该对象未将属性设置为其他内容。

如果您希望您的集合为“只读”,则可以使用ReadOnlyCollection界面。您可以在内部管理private列表,并且只能通过public ReadOnlyCollection公开。您所需的功能从未得到明确说明,因此我将不知道该怎么做。

答案 2 :(得分:0)

这是因为在使用string的情况下,您返回实例的副本-您无法为其分配实例。

Why .NET String is immutable?

List<T>的情况下,您将对实例返回 reference ,该实例不是恒定的-可以更改它。

要证明自己,可以执行以下操作:

class Test 
{
    private string val; 
    public ref string Val {get {return ref val;}}
}


void Main()
{
    Test t = new Test();
    t.Val = "a";

    Console.WriteLine("t.Val is - " + t.Val);
}

观察我在ref属性中使用的特殊string关键字,以表示必须返回string reference ,而不是副本

C# Concepts: Value vs Reference Types (Joseph Albahari)

答案 3 :(得分:0)

public List<string> list {get;}

这意味着,如果您对name执行相同的操作,则会导致错误。

test.list = new List<string>();

test.list获取list对象,然后调用list对象的Add方法。所以这很正常。