繁体   English   中英

C#只读获取访问器

[英]C# readonly get 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属性,它也是只读的,那么我可以在没有错误的情况下添加列表。 所以我不知道这是怎么发生的。

这是因为该set将引用设置List 对象 (集合的实际实例)。 List本身返回时不是只读的。 如果希望它是只读的,则可以执行以下操作:

private List<string> list;

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

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

如果您的代码如下所示:

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 您所需的功能从未得到明确说明,因此我将不知道所能提供的建议。

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

为什么.NET String是不可变的?

如果使用List<T> ,则返回对实例的引用 ,这种引用在您的情况下不是恒定的-可以更改它。

为了证明自己,您可以执行以下操作:

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

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

C#概念:值与引用类型(Joseph Albahari)

public List<string> list {get;}

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

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

test.list得到list对象,并调用方法中添加的list对象。 所以这很正常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM