方法

2017-10-03 7 views
0

内のクラスをインスタンス化すると、それがこの方法

void Instantiate(Class c) { 
    c = new Class(); 
} 

Class c1 = null; 
Instantiate(c1); 
c1.property .....gives me null reference exception 

クラスはメソッドの内部でインスタンス化することができ、それ以外では使用できを行うことは可能ですか?

+0

参照によって「c1」を渡す必要があります。 – MarcinJuraszek

+0

@MarcinJuraszek、返信メイトのおかげですが、参照型はメソッドに渡すときに参照が渡されませんか?ああ、それはそのメソッドに渡される前にインスタンス化されている場合にのみ発生するのですか? –

+0

私の解答を説明で更新しました。 C#ではすべてのパラメータがデフォルトで渡されます。参照タイプの場合、値はオブジェクトの参照(アドレス)です。しかし、その参照はコピーされるので、メソッド内でそれを変更すると、メソッドの外には反映されません。それを実現させるには 'ref'で渡す必要があります。 – MarcinJuraszek

答えて

0

はい、しかし、あなたは参照によって引数を渡す必要があります:

void Instantiate(ref Class c) { 
    c = new Class(); 
} 

Class c1 = null; 
Instantiate(ref c1); 

すべてのパラメータは、デフォルトで値によって渡されます。参照型の場合、参照は渡される値です。そのため、オブジェクトの内部状態を変更すると、メソッドの外側に表示されます(たとえば、要素をリストに追加するなど)。ただし、インスタンス全体を置き換えることはできません。その変更は呼び出し側には表示されません。

はあなたがList<T>を持っているとしましょう:

var myList = new List<T>(); 

はのは、それはいくつかのメモリ位置0x1234に初期化されますと仮定してみましょう。この方法のmyList外とlistdoSomethingWithAList内側のポイントの両方が同じADDRES (0x1234)でこの時点で

void doSomethingWithAList(List<T> list) 
{ 
} 

以降

doSomethingWithAList(myList); 

:今、あなたはList<T>を取るメソッドに渡します。 list.Add(default(T))を実行してmyList.Lenghthに電話すると、両方とも同じオブジェクト(0x1234)を指しているため、1に戻ります。しかし

doSomethingWithAListの内側にあなたがlistに新しいリストを割り当てた場合:その新しいオブジェクトで

void doSomethingWithAList(List<T> list) 
{ 
    list = new List<T>(); 
} 

のみlistポイント。 myListは依然として0x1234を示します。

List<T>を参照して更新すると、listのポイントも更新され、myListがメソッドの外側に更新されます。

+0

理解して、もう一度仲間に感謝! –

0

私は、すべてのパラメータが値によって別のメソッドに渡されるという混乱があると思います。したがって、参照型をメソッドに渡すと、参照のコピーがメソッドに渡されます。

例では、c1は最初はnullを指しています。 instantiateを呼び出すと、c1のコピーが作成されます(nullを指す)。c1_はc1ではなくinstantiateメソッドに渡されます。

コードを動作させるには2通りの方法があります。最初の方法は、refキーワードの使用です。 refキーワードを使用すると、c1をメソッドに渡すことができます。

void Instantiate(ref Class c) { 
    c = new Class(); 
} 

そして、私はあなたがこの特定の例では、戻り値の型を使用することをお勧めしますように

Instantiate(ref c1); 

としてそれを呼び出します。

Class Instantiate() { 
    return new Class(); 
} 

この方法を使用する方法は次のとおりです。

Class c1 = Instantiate(); 
+0

@Paulの説明に感謝します。 –