次のように、配列プロパティに割り当てを行う場合:
UserProfession.Designation[0] =txt_Search.Text.ToString();
実際に行っているのはget
、そのプロパティのセクションを呼び出すことです...ではありませんset
。これにより、プロパティをサポートするオブジェクトが返されます...インデックスだけでなく、オブジェクト全体が返されます。インデックスルックアップは、オブジェクトが返されるまで発生しません。そのオブジェクトを取得すると、インデックスへのアクセスは通常の方法で機能します。
配列オブジェクトへの参照を返す必要がある式があるため、この特定の例外が発生しますがUserProfession.Designation
、配列を初期化しないため、0番目の要素の参照を検索しようとしても何もありません。この時点で、フレームワークは、配列(「オブジェクト参照」)が「オブジェクトのインスタンスに設定されていない」ことを検出します...これは、それがであると言うための空想的な方法ですnull
。
つまり、割り当てる値を保持するには、既存の配列が必要です。これは、次のようなことを意味します。
Designation = new String[10];
public String[] Designation
{
get;
set;
}
set
ただし、このセクションを使用したことがないことに注意してください。したがって、次のように、それをさらに単純化できます。
Designation = new String[10];
public String[] Designation {get;private set;}
これにより、クライアントコードがオブジェクトの下から配列全体を完全にスワップアウトするのを防ぎますが、それ以外の場合は、配列プロパティの全機能を提供します。アレイに独自のバッキングストアを提供する場合は、機能を失うことなく、セッターを完全に取り除くこともできます。
private string[] _designation = new string[10];
public string[] Designation {get {return _designation;} }
しかし、もう1つしわを追加しましょう。初期化する前に配列に割り当てたいというあなたの願望は、それがどれだけ大きくなるかを実際には知らない可能性があることを私に示しています。その場合は、配列ではなく、ある種のコレクションが必要になる可能性があります。ジェネリックリストは、配列の便利で非常に互換性のある代替品です。これは次のようになります。
private List<string> _designation = new List<string>();
public List<string> Designation {get {return _designation;}}
配列の場合と同じように、インデックスでそのリスト内のアイテムにアクセスできます。今心配する必要がある唯一の違いは、新しいアイテムを追加する方法です。
UserProfession.Designation.Add(txt_Search.Text);
また、.ToString()呼び出しを削除したことにも注意してください。.Text
プロパティはほぼ確実にすでに文字列であるため、.ToString()メソッドを呼び出すのはばかげています。