在其他类中初始化的对象';s方法不是';t被C#中的调用方法引用
本文关键字:方法 调用 引用 其他 对象 初始化 | 更新日期: 2023-09-27 18:29:44
我有一个类,在其中我声明了一个对象,但不初始化该对象。然后,我将对象传递给另一个类中的方法进行初始化。我希望发生的是,调用类中的对象现在将具有对初始化对象的引用,但它是null。
下面是我的意思的一个例子:
class MainClass
{
ObjectA foo;
OtherClass.InitializeObjectA(foo);
// why is foo null over here?
}
class OtherClass
{
public static void InitializeObjectA(ObjectA device)
{
device = new ObjectA();
}
}
我的问题是,当我在调用InitializeObjectA()
后尝试使用foo时,设备仍然指向null!如果我将InitializeObjectA()
更改为out ObjectA device
,它会起作用。有人能解释为什么需要这样做吗?
如果你想让它工作,你需要通过引用:
public static void InitializeObjectA(ref ObjectA device)
{
或者:
public static void InitializeObjectA(out ObjectA device)
{
如果没有这一点,InitializeObjectA
会将device
参数设置为new ObjectA()
,但这不会影响调用者,因为默认情况下,引用是通过值传递的。
请注意,如果您只是尝试初始化,返回一个实例而不是void通常是处理此问题的更好方法:
public static ObjectA InitializeObjectA()
{
return new ObjectA();
}
这避免了使用ref
或out
传递的需要。
类是一个引用类型,您将foo的地址作为参数(副本)传递,在其中更改副本,但新地址不会设置回原始foo。这将只使用out或ref关键字来完成。
创建名为foo的ObjectA实例的最简单方法是返回要分配给变量的实例
class MainClass
{
ObjectA foo = OtherClass.InitializeObjectA();
}
class OtherClass
{
public static ObjectA InitializeObjectA()
{
return new ObjectA();
}
}
为什么不让Initialize方法返回创建的对象?
class MainClass
{
var foo = OtherClass.InitializeObjectA(foo);
}
class OtherClass
{
public static ObjectA InitializeObjectA(ObjectA device)
{
return new ObjectA();
}
}
据我所知,C#编译器实际上并没有像那样为您初始化变量。我甚至无法在VisualStudio2010中编译此代码,因为将未初始化的参数传递给函数是一个错误。
您想要:
ObjectA foo = null;
这就是我认为你无论如何都要做的,C#并不像在Java中那样为你做这件事。不过,这仍然没有达到我认为您试图实现的行为,这可能最好通过将代码重构为类似的东西来实现
ObjectA foo = InitializeObjectA()
public static ObjectA InitializeObjectA(){
return new ObjectA();
}
或者,您可以使用pass-by-reference,将引用(或指针,如果您熟悉的话)传递给函数,这样对该引用所做的更改就会反映在函数的范围之外。
这是因为当你进行时
device = new ObjectA();
您正在将对象设置为一个新对象,在内存中使用不同的引用。
你应该做一些类似的事情:
class MainClass
{
ObjectA foo = OtherClass.InitializeObjectA(foo);
}
class OtherClass
{
public static ObjectA InitializeObjectA(ObjectA device)
{
return = new ObjectA();
}
}
或者改为
class MainClass
{
ObjectA foo = null;
OtherClass.InitializeObjectA(out foo);
}
class OtherClass
{
public static void InitializeObjectA(out ObjectA device)
{
device = new ObjectA();
}
}
关于为什么会发生这种情况的更多信息可以在这里找到。