2012-04-18 3 views
2

別のクラスAのタイプBのオブジェクトを初期化したいのですが、どうしてnullになるのですか? refout修飾子を使用せずに行うことはできますか?同じ方法で(refを使わずに)オブジェクトを初期化できないのはなぜですか?

class A 
    { 
     public void Initialize(B value) 
     { 
      if (value == null) 
      { 
       value = new B(); 
      } 
     } 
    } 

    class B 
    { 

    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      A a = new A(); 
      B b = null; 
      a.Initialize(b); 
     } 
    } 

[UPD。]私はそれは、クラスのインスタンスだのためb変数はrefで渡すことができると思っていました。それが好き

class A 
{ 
    public B Initialize(B value) 
    { 
     if (value == null) 
     { 
      value = new B(); 
     } 
     return value; 
    } 
} 

を、コール:

+0

なぜ*他に何かが期待されますか? http://pobox.com/~skeet/csharp/parameters.htmlを参照してください。 –

答えて

6

ことが可能であり、単に初期化()関数を作る

static void Main(string[] args) 
    { 
     A a = new A(); 
     B b = null; 
     b = a.Initialize(b); 
    } 

これは良い解決策である、データフローがはっきりと見えます。驚く様な事じゃない。

しかし、そうでない場合は、単にref(ないout)を使用します。public void Initialize(ref B value)a.Initialize(ref b);


を呼び出して、私はそれがクラスのインスタンスだのためのb変数が参照によって渡すことができると思っていました。あなたは非常に正確な言葉遣い必要があることを答えるために

bは、クラスのインスタンスではありません。 bはインスタンスへの参照です。インスタンスには決して名前はありません。

そしてbは、値の型と同じように扱われます。参照は値によってメソッドに渡されます。 refを使用しない限りこのメソッド内

+1

'??'演算子はここで便利です: 'public B Initialize(B value){戻り値??新しいB(); } ':) – Guffa

+0

@Guffa - 私は知っていますが、私は元のコードに最小限の変更を加えました。説明のためには、@HenkHolterman thanx。 –

+0

私は「bはクラスのインスタンスではありません.bはインスタンスへの参照です」という事実を本当に見逃しました。 –

1

public void Initialize(B value)

valueは 、発信者が影響を受けないで、あなたはそれに何かを割り当てるときに、ちょうどローカル変数のようなものです。

refおよびout修飾子を使用せずに行うことはできますか?

いいえ、このようには、ref/outがありません。

新しいオブジェクトを返すだけで、呼び出し元に割り当てることができます。

public B Initialize() { 
    return new B(); 
    } 

... 
    b = a.Initialize(); 
関連する問題