0

古典的な意味では、読み取り専用オブジェクトはコンストラクターでのみ設定でき、後で変更することはできません。読み取り専用の int 配列の動作が異なるのはなぜですか。

PS:私はReadonlyコレクションを認識しています。なぜこれが許可されているのか知りたいのですが?

class Class1
{
    public readonly int[] a;

    public Class1()
    {
        a = new int[3];
        a[0] = 1;
        a[1] = 2;
        a[2] = 3;
    }

    public void Update()
    {
        a[0] = 10;
    }
}
4

3 に答える 3

4

readonly 修飾子は、割り当てられた実際の型に適用されます。したがって、この場合、配列型のインスタンスに割り当てられますが、その中に存在する要素には割り当てられません

そのため、はい、要素の値を変更することはできますが、コードは次のようになります

public void Update()
{
   a[0] = new int[3];
}

Array タイプのインスタンス (およびその内容ではない) を変更しようとしているため、失敗します。

お役に立てれば。

于 2013-06-19T09:00:51.317 に答える
3

readonly配列項目ではなく、配列を不変にします。インラインまたはコンストラクターでのみreadonly配列をフィールドに割り当てることができることを意味します。aただし、各配列項目の内容を変更することを妨げるものではありません。

于 2013-06-19T08:59:15.353 に答える
0

この配列のコンテンツを読み取り専用にする場合は、次のようにします

public readonly int[] a;
ReadOnlyCollection<int> result = Array.AsReadOnly(a);
public Class1()
{
    a = new int[3];
    a[0] = 1;
    a[1] = 2;
    a[2] = 3;

}

public void Update()
{
    result[0] = 10; // Compile Time Error Here
}
于 2013-06-19T09:00:01.940 に答える