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);
        }
    }

[更新。]我认为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 回答