为什么我不能以相同的方式初始化对象(不使用 ref)

本文关键字:对象 ref 初始化 方式 不能 为什么 | 更新日期: 2023-09-27 18:31:32

我想从另一个类A初始化一个类型为 B 的对象,为什么我仍然得到 null?是否可以不使用refout修饰符来做到这一点?

    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传递,因为它是类的实例。

为什么我不能以相同的方式初始化对象(不使用 ref)

这是可能的,只需将 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.

public void Initialize(B value)

在此方法中,value就像一个局部变量,当您为其分配某些内容时,呼叫者不受影响。

是否可以在不使用 ref 和 out 修饰符的情况下做到这一点?

不,不是以这种方式,这就是 ref/out 的用途。

不过,您可以只返回新对象,并将其分配给调用方。

 public B Initialize() {
     return new B();
  }
... 
  b = a.Initialize();