![](/img/trans.png)
[英]Can method in an other class dispose calling object? (Garbage Collector) 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)
{
沒有它, InitializeObjectA
將device
參數設置為new ObjectA()
,但這不會影響調用者,因為默認情況下, 引用是按值傳遞的 。
請注意,如果您只是嘗試初始化,則返回實例而不是void通常是處理此問題的更好方法:
public static ObjectA InitializeObjectA()
{
return new ObjectA();
}
這避免了使用ref
或out
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。 這只能使用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#編譯器實際上並不像你那樣初始化變量。 我甚至無法在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.