在其他类中初始化的对象';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,它会起作用。有人能解释为什么需要这样做吗?

在其他类中初始化的对象';s方法不是';t被C#中的调用方法引用

如果你想让它工作,你需要通过引用:

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

这避免了使用refout传递的需要。

类是一个引用类型,您将foo的地址作为参数(副本)传递,在其中更改副本,但新地址不会设置回原始foo。这将只使用outref关键字来完成。

创建名为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();
    }
}

关于为什么会发生这种情况的更多信息可以在这里找到。