2

B別のクラスの型のオブジェクトを初期化したいのですがA、なぜまだnullになるのですか?修飾子を使用refせずにそれを行うことは可能ですか?out

    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

4

2 に答える 2

6

Initialize()を関数にするだけで可能です。

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

そしてそれを次のように呼びます:

    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変数はクラスのインスタンスであるため、refで渡すことができると思いました。

非常に正確な表現が必要であると答えるには、クラスのインスタンスでbはありません。bインスタンスへの参照です。インスタンスに名前が付くことはありません。

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

于 2012-04-18T08:04:45.987 に答える
1

public void Initialize(B value)

このメソッド内でvalueは、ローカル変数と同じように、何かを割り当てるときに、呼び出し元は影響を受けません。

refおよびout修飾子を使用せずにそれを行うことは可能ですか?

いいえ、この方法ではありません。それがref/outの目的です。

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

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

... 
  b = a.Initialize();
于 2012-04-18T08:04:50.510 に答える