为什么我不能以相同的方式初始化对象(不使用 ref)
本文关键字:对象 ref 初始化 方式 不能 为什么 | 更新日期: 2023-09-27 18:31:32
我想从另一个类A
初始化一个类型为 B
的对象,为什么我仍然得到 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
传递,因为它是类的实例。
这是可能的,只需将 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();