代码:- (注意:-这里我使用的是只读字,表示该属性仅具有访问器。)
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属性,它也是只读的,那么我可以在没有错误的情况下添加列表。 所以我不知道这是怎么发生的。
答案 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
的情况下,您返回实例的副本-您无法为其分配实例。
在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 ,而不是副本。
答案 3 :(得分:0)
public List<string> list {get;}
这意味着,如果您对name
执行相同的操作,则会导致错误。
test.list = new List<string>();
test.list
获取list
对象,然后调用list
对象的Add方法。所以这很正常。