3

我有一个类,我在其中声明一个对象,但不初始化该对象。然后我将对象传递给另一个类中的方法进行初始化。我期望发生的是调用类中的对象现在将具有对初始化对象的引用,但它是空的。

这是我的意思的一个例子:

class MainClass
{
    ObjectA foo;

    OtherClass.InitializeObjectA(foo);

    // why is foo null over here?
}

class OtherClass
{
    public static void InitializeObjectA(ObjectA device)
    {
        device = new ObjectA();
    }
}

我的问题是,当我在调用它后尝试使用 foo 时,该设备InitializeObjectA()仍然指向 null!如果我改变InitializeObjectA()它的out ObjectA device工作原理。谁能解释为什么需要这样做?

4

6 回答 6

4

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

public static void InitializeObjectA(ref ObjectA device)
{

或者:

public static void InitializeObjectA(out ObjectA device)
{

没有它,InitializeObjectAdevice参数设置为 a new ObjectA(),但这不会影响调用者,因为默认情况下,引用是按 value 传递的

请注意,如果您只是尝试初始化,则返回实例而不是 void 通常是处理此问题的更好方法:

public static ObjectA InitializeObjectA()
{
     return new ObjectA();
}

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

于 2013-08-29T19:34:09.910 回答
1

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

于 2013-08-29T19:33:11.263 回答
1

创建名为 foo 的 ObjectA 实例的最简单方法是返回实例以分配给变量

class MainClass
{
    ObjectA foo = OtherClass.InitializeObjectA();
}

class OtherClass
{
    public static ObjectA InitializeObjectA()
    {
        return new ObjectA();
    }
}
于 2013-08-29T19:35:53.883 回答
1

为什么不让 Initialize 方法返回创建的对象?

class MainClass
{
    var foo = OtherClass.InitializeObjectA(foo);
}

class OtherClass
{
    public static ObjectA InitializeObjectA(ObjectA device)
    {
        return new ObjectA();
    }
}
于 2013-08-29T19:36:50.170 回答
1

据我了解,C# 编译器实际上并没有像那样为你初始化变量。我什至无法在 Visual Studio 2010 中编译此代码,因为将未初始化的参数传递给函数是错误的。

你要:

ObjectA foo = null;

这就是我认为无论如何您都在尝试做的事情,C# 并没有像在 Java 中那样为您做这件事。这仍然没有得到我认为你想要实现的行为,这可能最好通过将代码重构为类似的东西来实现

ObjectA foo = InitializeObjectA()

public static ObjectA InitializeObjectA(){
    return new ObjectA();
}

或者,您可以使用按引用传递,将引用(或如果您熟悉它的指针)传递给函数,因此对该引用所做的更改会反映在函数范围之外。

于 2013-08-29T19:38:23.067 回答
0

那是因为当你这样做

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

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

于 2013-08-29T19:32:18.763 回答