2017-09-14 3 views
-1

内の変数を初期化します。は方法

は、我々が持っていると仮定:

aspxページで
T obj = GetT(); 

。 (GetT()はnull値を返すことができます)。
そして、私はこれを処理するには、関数内でobjを

public void HandlingT(T obj){ 
    if(condition && obj == null){ 
     obj = new T(); 
    } 
    //...handling object T 
} 

は、だから我々が得る:

T obj = GetT(); 
HandlingT(obj); 

問題は、私はaspxページで機能HandlingT()を呼び出すとき、objはあっても、まだnullの場合、ありますconditionが真である

+0

代わりに、TのアドレスをhandlingT()メソッドに代入する必要がありますか? – kevricher

+0

コードのASPX側を含めることはできますか? – combatc2

+2

'HandlingT(out T obj)'を試す –

答えて

0
のようにただ持っている必要があり、オブジェクトを作成し、それを返していないので、それが nullなっ関数スコープの外に行く

public T HandlingT<T>(T obj){ 

されています

あなたは値と参照を混同しています。これを行うと:

T obj = GetT(); 
HandlingT(obj); 

そしてHandlingT方法の内側には、次の操作を行います。

外その方法の を作成obj変数へしません
obj = new T(); 

。変数は偶然同じ名前ですが、同じ変数ではありません。あなたがしているのは、Tのインスタンスを作成し、メソッドの変数ローカルに割り当てることです。その参照をメソッド外の変数に代入したい場合は、その変数を変数に代入する必要があります。

したがって、たとえば、あなたがメソッドからインスタンスを返すことができます:

public T HandlingT(T obj){ 
    if(condition && obj == null){ 
     obj = new T(); 
    } 
    return obj; 
} 

や使用方法の外の値が返されました:

T obj = GetT(); 
obj = HandlingT(obj); 

基本的には、割り当てはに起こりますメモリ内のオブジェクトではなく、変数です。変数を使用してオブジェクトを参照すると、そのメモリ内オブジェクトを変更できます。しかし、変数を新しいオブジェクトに割り当てると、変数が元々指していたものを変更していないので、それを他のものに指しているだけです。例は、もともとメソッドに渡されたインスタンスには何もしないこと

void DoSomething(MyObj obj) 
{ 
    obj = new MyObj(); 
    obj.Something = "foo"; 
} 

が、この考えてみましょう。新しいインスタンスが作成され、メソッド内でのみ参照されます。メソッドが終了すると、そのインスタンスはガベージコレクトされ、メソッドに渡された元のインスタンスは変更されません。これ

コントラスト:新しいインスタンスが作成されていないので

void DoSomething(MyObj obj) 
{ 
    obj.Something = "foo"; 
} 

、ローカルobj変数はまだメソッドに渡されたのと同じメモリ内インスタンスを指します。その参照に従い、元のインスタンスが変更され、メソッドが完了した後にメソッドの外に変更が表示されます。

+0

大変感謝しています@David、私は指向オブジェクトについて知らなかったことを教えてくれました – kevricher

+0

@kevricherこれは何もしませんオブジェクト指向プログラミングでは、これは値と参照のセマンティクスの違いに過ぎません。 – Servy

1

次に、Genericを使用して以下のようにTを返すようにメソッドを変更します。基本的に、あなたはTは、実際のオブジェクトのためのプレースホルダであるならば、あなたは

public T HandlingT(T obj){ 
    if(condition && obj == null){ 
     obj = new T(); 
    } 
    //...handling object T 

    return obj; 
} 
+0

ジェネリックスのビットはここではちょうど赤いニシンだと思っています.OPは実際のコードのプレースホルダーとして 'T'を使用しているようです。また、パラメータを 'ref'に変更するとここで十分であるはずです(私はあなたのようなリターンを好むのですが)。 – DavidG

+0

@DavidG、はい非常にうまくいくかもしれませんが、問題の' T'の使用と混乱していますが、 – Rahul

+0

Tを使って誤解をおかけして申し訳ありません、ここで私はTを作成したクラスに紹介しています – kevricher