我有这段代码:
public List<IVehicle> Vehicles { get; private set; }
我的问题是即使我使用私人套装,为什么我仍然可以在此列表中添加值。
答案 0 :(得分:2)
使用私人Set
,您无法从列表外部将列表设置为某个新列表。例如,如果您在类中有此列表:
class SomeClass
{
public List<IVehicle> Vehicles { get; private set; }
}
然后使用:
SomeClass obj = new SomeClass();
obj.Vehicles = new List<IVehicle>(); // that will not be allowed.
// since the property is read-only
它不会阻止您评估列表中的Add
方法。例如
obj.Vehicles.Add(new Vehicle()); // that is allowed
要返回只读列表,您可以查看List.AsReadOnly Method
答案 1 :(得分:1)
.Add()
是类List<>
上的函数,因此在您get
列表后,您可以调用该函数。您无法将该列表替换为另一个列表。
你可以返回一个IEnumerable<IVehicle>
,它会使列表(sortof)只读。
在列表上调用.AsReadOnly()
会产生一个真正的只读列表
private List<IVehicle> vehicles;
public IEnumerable<IVehicle> Vehicles
{
get { return vehicles.AsReadOnly(); }
private set { vehicles = value; }
}
答案 2 :(得分:1)
因为private set;
不允许您直接设置列表,但您仍然可以调用此列表的方法,因为它使用的是getter。您可能想要使用下一个:
//use this internally
private List<IVehicle> _vehicles;
public ReadOnlyCollection<IVehicle> Vehicles
{
get { return _vehicles.AsReadOnly(); }
}
答案 3 :(得分:0)
Getters和setter适用于实例;而不是实例的属性。一个例子;
Vehicles = new List<IVehicle>(); //// this is not possible
但如果有实例,则可以更改其属性。
答案 4 :(得分:0)
当使用时使用private set
这意味着属性本身在类外部是不可访问的,而不是它的方法不可用,List<T>.Add()
只是编译器的一种方法什么都不知道。
以示例:
public class VehicleContainer{
public List<IVehicle> Vehicles { get; private set; }
...
}
....
VehicleContainer vc = new VehicleContainer();
vc.Vehicles = new List<IVehicle>() // this is an error, because of the private set
int x = vc.Vehicles.Count; // this is legal, property access
vc.Vehicles.Add(new Vehicle()); //this is legal, method call
看看at this question,在您想要限制对集合本身的访问以及对集合的引用的情况下,解释了使用ReadOnlyCollection
类的情况。
答案 5 :(得分:-1)
您只能在List<IVehicle>
的包含类/结构中实例化它。但是一旦你有了一个实例,你甚至可以在外面添加项目,因为该对象是公开可见的。