私はこのコードを持っています:
public List<IVehicle> Vehicles { get; private set; }
私の質問は、プライベート セットを使用しているにもかかわらず、なぜこのリストに値を追加できるのかということです。
私はこのコードを持っています:
public List<IVehicle> Vehicles { get; private set; }
私の質問は、プライベート セットを使用しているにもかかわらず、なぜこのリストに値を追加できるのかということです。
privateSet
では、リストをクラス外から新しいリストに設定することはできません。たとえば、クラスに this リストがある場合:
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 メソッドを調べます。
.Add()
クラスの関数なList<>
のでget
、リストの後に関数を呼び出すことができます。リストを別のリストに置き換えることはできません。
IEnumerable<IVehicle>
リスト (sortof) を読み取り専用にする を返すことができます。
リストを呼び出す.AsReadOnly()
と、実際には読み取り専用のリストになります
private List<IVehicle> vehicles;
public IEnumerable<IVehicle> Vehicles
{
get { return vehicles.AsReadOnly(); }
private set { vehicles = value; }
}
private set;
リストを直接設定することはできませんが、ゲッターを使用しているため、このリストのメソッドを呼び出すことができます。次に使用することをお勧めします。
//use this internally
private List<IVehicle> _vehicles;
public ReadOnlyCollection<IVehicle> Vehicles
{
get { return _vehicles.AsReadOnly(); }
}
ゲッターとセッターはインスタンスで機能します。インスタンスのプロパティではありません。例;
Vehicles = new List<IVehicle>(); //// this is not possible
ただし、インスタンスがある場合は、そのプロパティを変更できます。
use a を使用する場合、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
コレクションへの参照だけでなく、コレクション自体へのアクセスを制限する場合のクラスの使用が説明されているthis questionを見てください。ReadOnlyCollection
の含まれているクラス/構造体内でのみインスタンス化できますList<IVehicle>
。ただし、インスタンスを取得すると、オブジェクトがパブリックに表示されるため、外部でもアイテムを追加できます。