1

さて、私はこのクラスとメインを持っています。私は VS 2010 Ultimate と .NET 4 クライアントを使用しています。

internal class tezt
{
    private int[] _numeros = new int[5];
    public int[] Numeros
    {
        get { return _numeros; }
    }
}
public class tezt2
{
    private int[] _numeros = new int[5];
    public int[] Numeros
    {
        get { return _numeros; }
    }
}
class tezt3
{
    private int[] _numeros = new int[5];
    public int[] Numeros
    {
        get { return _numeros; }
    }
}
internal static class Program
{
    private static void Main()
    {
        var arrNums = new tezt();
        var arrNums2 = new tezt2();
        var arrNums3 = new tezt3();
        Console.WriteLine(arrNums.Numeros[0]);
        arrNums.Numeros[0] = 5;
        Console.WriteLine(arrNums.Numeros[0]);
        Console.WriteLine(arrNums2.Numeros[0]);
        arrNums2.Numeros[0] = 6;
        Console.WriteLine(arrNums2.Numeros[0]);
        Console.WriteLine(arrNums3.Numeros[0]);
        arrNums3.Numeros[0] = 7;
        Console.WriteLine(arrNums3.Numeros[0]);
        Console.ReadKey(true);
    }
}

これらの行で何が起こっているか:

arrNums.Numeros[0] = 5;
arrNums2.Numeros[0] = 6;
arrNums3.Numeros[0] = 7;

それらのオブジェクトの派生元のクラスにはsetパラメーターがないため、それらの割り当てを許可してはならないのではないでしょうか?

それを回避したり、制限したりarrNums.Numeros[0] = 5;、エラーをスローするようなことをするために何ができますか?

4

2 に答える 2

2

プロパティを設定しているのではなく、Numerosそのプロパティ内のインデックスで要素を変更しています。そのプロパティのゲッターのみを使用しています。

許可されていない代入は、そのオブジェクトのプロパティに新しい値を代入することです:

arrNums.Numeros = new int[5]; // will not compile.

ゲッターがIEnumerable<int>それを保護するために を返すようにすることができます:

class tezt3
{
    private int[] _numeros = new int[5];
    public IEnumerable<int> Numeros
    {
        get { return _numeros; }
    }
}

を使用することもできますReadOnlyCollectionIEnumerable<T>vsを使用することの長所と短所については、この質問ReadOnlyCollection<T>で詳しく説明しています。

于 2012-04-25T02:18:31.023 に答える
0

プロパティで配列を使用しないようにアドバイスできますか。フレームワーク設計ガイドラインからの引用です

配列を返すプロパティは、非常に誤解を招く可能性があります。通常、ユーザーが内部状態を変更できないように、内部配列のコピーを返す必要があります。これにより、コードが非効率的になる可能性があります。

次の例では、ループの反復ごとに Employees プロパティが 2 回アクセスされます。次の短いコード サンプルでは、​​2n + 1 コピーになります。

Company microsoft = GetCompanyData("MSFT");
for (int i = 0; i < microsoft.Employees.Length; i++)
{   
  if (microsoft.Employees[i].Alias == "kcwalina")
  {  ...  }
}

この本の注釈者であるBrad Abramsは、この落とし穴について次のように述べています。

この本のガイドラインのいくつかは議論され、アブストラクトで合意されました。他の人はハードノックの学校で学びました。配列を返すプロパティのガイドラインは、ハード ノック キャンプの学校にあります。.NET Framework バージョン 1.0 のいくつかのパフォーマンスの問題を調査していたとき、何千もの配列が作成され、すぐに破棄されていることに気付きました。フレームワーク自体の多くの場所がこのパターンに遭遇したことが判明しました。言うまでもなく、これらのインスタンスとガイドラインを修正しました。- ブラッド・エイブラムス

于 2012-04-25T03:05:44.930 に答える