簡體   English   中英

在C#中調用方法不引用在其他類的方法中初始化的對象

[英]Object initialized in other class's method isn't referenced by calling method in C#

我有一個類,我聲明一個對象,但不初始化對象。 然后我將對象傳遞給另一個類中的方法進行初始化。 我期望發生的是調用類中的對象現在將具有對初始化對象的引用,但它是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)
{

沒有它, InitializeObjectAdevice參數設置為new ObjectA() ,但這不會影響調用者,因為默認情況下, 引用是按值傳遞的

請注意,如果您只是嘗試初始化,則返回實例而不是void通常是處理此問題的更好方法:

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

這避免了使用refout pass的需要。

那是因為當你這樣做的時候

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

有關這種情況發生原因的更多信息,請點擊此處

一個類是一個引用類型,你傳遞foo的地址作為參數(copy),在你更改副本,但新地址不會被設置回原來的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#編譯器實際上並不像你那樣初始化變量。 我甚至無法在Visual Studio 2010中編譯此代碼,因為將未初始化的參數傳遞給函數是錯誤的。

你要:

ObjectA foo = null;

無論如何,我認為你正在嘗試做什么,C#只是不像你在Java那樣為你做。 這仍然沒有得到我認為你想要實現的行為,這可能最好通過將代碼重構為類似的東西來實現

ObjectA foo = InitializeObjectA()

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

或者,您可以使用按引用傳遞,在此處將引用(或指針,如果您熟悉它)傳遞給函數,因此對該引用所做的更改將反映在函數范圍之外。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM