![](/img/trans.png)
[英]C# protected readonly autoproperty with only a get accessor vs protected readonly field
[英]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
情况下,您将返回实例的副本 -您无法为其分配实例。
如果使用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
引用 ,而不是它的副本 。
public List<string> list {get;}
这意味着,如果您对name
执行相同的操作,则会导致错误。
test.list = new List<string>();
test.list
得到list
对象,并调用方法中添加的list
对象。 所以这很正常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.