1

私はこのコードを持っています:

public List<IVehicle> Vehicles { get; private set; }

私の質問は、プライベート セットを使用しているにもかかわらず、なぜこのリストに値を追加できるのかということです。

4

6 に答える 6

2

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 メソッドを調べます。

于 2012-12-06T07:43:09.533 に答える
1

.Add()クラスの関数なList<>のでget、リストの後に関数を呼び出すことができます。リストを別のリストに置き換えることはできません。

IEnumerable<IVehicle>リスト (sortof) を読み取り専用にする を返すことができます。

リストを呼び出す.AsReadOnly()と、実際には読み取り専用のリストになります

private List<IVehicle> vehicles;

public IEnumerable<IVehicle> Vehicles 
{ 
    get { return vehicles.AsReadOnly(); }
    private set { vehicles = value; }
}
于 2012-12-06T07:44:00.543 に答える
1

private set;リストを直接設定することはできませんが、ゲッターを使用しているため、このリストのメソッドを呼び出すことができます。次に使用することをお勧めします。

    //use this internally
    private List<IVehicle> _vehicles;

    public ReadOnlyCollection<IVehicle> Vehicles
    {
        get { return _vehicles.AsReadOnly(); }
    }
于 2012-12-06T07:48:04.833 に答える
0

ゲッターとセッターはインスタンスで機能します。インスタンスのプロパティではありません。例;

Vehicles = new List<IVehicle>(); //// this is not possible

ただし、インスタンスがある場合は、そのプロパティを変更できます。

于 2012-12-06T07:44:42.277 に答える
0

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

于 2012-12-06T07:48:51.553 に答える
-1

の含まれているクラス/構造体内でのみインスタンス化できますList<IVehicle>。ただし、インスタンスを取得すると、オブジェクトがパブリックに表示されるため、外部でもアイテムを追加できます。

于 2012-12-06T07:43:06.497 に答える