對象創建差異
回答
第一個命令在棧上分配一個變量(A a
),並在堆上初始化(new A()
)。
第二個只分配堆棧上的變量。它沒有被初始化,因此只有通過函數的返回值或調用類構造函數才能使用它,直到它被賦值爲止。
側面說明:當你的程序被編譯,並正在運行,它甚至不遠程像你寫的代碼。變量在你需要之前加載。你有上面的代碼將大致是這樣的:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 8 (0x8)
.maxstack 1
.locals init ([0] class DERP.Program/A a, // This code here declares a local
// variable: A a;
[1] class DERP.Program/A b) // another local variable: A b;
nop
newobj instance void DERP.Program/A::.ctor() // This is: new A()
stloc.1 // this loads the new A() we created
// into A b; (stloc.1 means to store
// the last item we created into the
// local variable at index [1]
ret
} // end of method Program::Main
這沒關係,如果你不完全瞭解每種這些命令的是,但我曾評論它試圖使它作爲儘可能直接前進。因爲我們從未將
A a
分配給任何東西,所以它只是坐在本地堆棧上,閒逛,什麼都不做。我們不能使用它,因爲它不指向任何對象。
有許多不同的原因在代碼中,你可能會看到從實際分配分開的聲明。
例如,有時您需要聲明try {} catch {}
子句之外的變量。讓我們說你的類在它的構造函數中取值。你有一個能夠從數據庫中獲取數據的函數。但是,由於其調用了數據庫,因此您希望捕獲該異常,並且如果拋出異常,則使用默認值初始化該類,而不是從DB調用返回的值。
由於道路作用域工作在C#中,try {} catch {}
內聲明的變量是不是它的訪問之外,因此你需要在代碼聲明變量更早之前,你初始化它。
您的陳述:「第二個只在堆棧上分配變量,它沒有被初始化,因此在你賦值之前不能使用它,要麼是函數的返回值,要麼是調用類構造函數。現在告訴我,如果用我的第二個對象A a調用函數,那該怎麼辦? a.Func();如果func不返回任何東西,那麼是否有可能使用它? –
好吧,我明白了你的意思......謝謝 –
不。如果你聲明瞭一個變量'A a',你*不能*以任何方式使用它,除了分配一些東西給它。 'a.Func()'會產生一個編譯錯誤,告訴你這個變量沒有被初始化。你需要做'A a = new A()'或'A a = SomeFunctionThatReturnsClassA()' –
A a = new A();
這將創建A
類型的新對象。 a
的值將是A
的新實例。
A a;
這將只是一個聲明作爲一種類型的A
。 a
的值將是null
。
第一個創建一個新的insatnce並將其分配給變量a
。
第二個不創建任何實例,所以a
是null
。
在第一條語句,將創建的類的一個新的對象實例和將被分配給一個變量
在第二聲明它是僅創建參考。
只有你的第一個聲明實際上創建了一個新的對象。第二個聲明只是在你的堆棧中分配了一個類型爲A的變量。
第一個在管理堆上創建一個新對象,在其上存儲在堆棧上創建的類型爲A
的變量a上的引用。
- 1. 對象創建差異
- 2. 差異在Django對象創建調用
- 3. 創建對象和初始化的對象 - 差異
- 4. Java對象差異
- 5. AngularJS對象差異
- 6. 創建對象異步
- 7. 對象創建異常
- 8. C++異步創建對象
- 9. Objective-C的對象創建方法的差異
- 10. JavaScript靜態對象創建方法的差異
- 11. 嘗試差異'[對象對象]'錯誤
- 12. 差異與[對象HTMLDivElement]
- 13. 尋找差異對象
- 14. 圓括號 「()」 創建差異
- 15. 當創建差異接口
- 16. FOREIGN KEY創建的差異
- 17. LayoutInflater創建的差異
- 18. 混帳創建差異
- 19. 線程創建差異
- 20. 拋出異常對象創建
- 21. 創建配置對象給我異常
- 22. 創建從對象異步瀑布
- 23. 如何從差異向量中輕鬆創建差異矩陣?
- 24. 差異創造
- 25. Java字符串創建對象:Java和JNI中的執行時間差異
- 26. 創建對象的對象
- 27. 創建創建空對象
- 28. 對象創建
- 29. 創建對象
- 30. 創建對象
這功課嗎? – mjv
如果你向我們解釋你的意思,那會更好。 – Woot4Moo