6

次のようなコードがあるとします。

    private IList<Vector3> vertices;
    private IList<uint> indices;

    public Mesh(IList<Vector3> vertices, IList<uint> indices)
    {
        // ???
    }

明確にするために、頂点とインデックスをコンストラクターに格納したいと思います。私は C# をあまり使ったことがないので、規則がどのように見えるかわかりません。リスト全体のコピーを作成する必要がありますか?それとも参照のみをコピーできますか? コンベンションは何ですか?

4

5 に答える 5

6

意向次第です。ただし、通常は、関数内のリストの変更を制御できるように、別のコピーが必要です。カプセル化についてです。

ただし、このクラスでそれが意図されていない場合は、リストへの参照を格納するだけで問題ありません。

于 2013-08-08T15:03:50.323 に答える
4

リストへの参照をコピーするだけです。メンバー変数とコンストラクター引数に同じ名前を付けたので、thisキーワードを使用する必要があります。

private IList<Vector3> vertices;
private IList<uint> indices;

public Mesh(IList<Vector3> vertices, IList<uint> indices)
{
    this.vertices = vertices;
    this.indices = indices;
}

リストは Mesh クラスに保存されます

于 2013-08-08T15:03:54.677 に答える
1

それはあなたが必要とするものに依存します。あなたは単に書くことができます

this.vertices = vertices;

これにより、リストへの参照が保存されます。これは、外部で行われたすべての変更がリストに反映されることを意味します。

一方、リストをコピーできます-

this.vertices = new List<Vector3>(vertices);

これにより、リスト内のアイテムが実際にコピーされ、外部で行われた変更は表示されません。注 - コピーされたアイテムは参照のままです。それらに加えられた変更は、メソッド内に反映されます。必要に応じて、新しいリスト用にそれらのコピーを作成することもできます。

繰り返しますが、必要なものによって異なります。

于 2013-08-08T15:06:30.717 に答える
0

この種のことには常に注意する必要があります。たとえば、Mesh クラスが不変であることが意図されている場合は、データのコピーを作成して、外部コードが編集不可能なデータであることを意図したものを変更するのを防ぐ必要があります。

個人的には、特に理由がない限り、常にデータのコピーを保存しています。

于 2013-08-08T15:05:25.353 に答える
0
private IList<Vector3> vertices;
private IList<uint> indices;

public Mesh(IList<Vector3> vertices, IList<uint> indices)
{
    this.vertices = vertices;
    this.indices = indices;
}

内でアクセスしたい場合はMesh、はい、そこに配置する必要があります。これは通常、上記のように行われます。

于 2013-08-08T15:04:10.303 に答える