在C++中,我們可以使用ptr = nullptr
更改指針本身,使用*ptr
修改指針引用的對象。例如:
int* ptr = new int(5);
*ptr = 10; // Modifies the object
ptr = nullptr; // Changes the pointer itself
在C#中,我們有類似的引用場景。例如:
StringBuilder sb = new StringBuilder("Hello");
sb.Append(" World"); // Modifies the object
sb = null; // Sets the reference to null
我的問題是關于語法以及為什么它的行為不同。明確地:
- 當我使用
sb.Append()
時,它對sb
指向的對象進行操作,而不是對引用本身進行操作。 - 當我使用
sb = null
時,它將引用設置為null
,但不會影響對象。
為什么C#中sb = null
的語法不被解釋為將對象設置為null
,類似于C++中ptr = nullptr
的工作方式?或者換句話說,為什么我不必取消引用sb
來調用Append()
方法?在C#中,為什么不需要顯式地取消引用以對對象執行操作,以及它如何知道何時取消引用指針以及何時直接操作指針?
我已經仔細閱讀了這篇文章,但還沒有找到一個好的解釋。到目前為止,我所學到的就是C#可能不允許我們顯式地取消引用,但這不是很令人困惑嗎?從概念上講,我可能知道sb = null
不能將引用的指針設置為null
,但語法不是說不是這樣,或者至少是明確的嗎?
我想弄清楚為什么C#中的語法不能直接映射到C++中的指針操作,以及該語言如何確保這種區別。
實際上,它在語法上與C++沒有太大不同。從概念上講,C#中的引用類型變量和C++中的指針確實共享一個公共基,盡管在細節上存在不少差異。但既然你問了語法,情況就簡單了:
在C++中,你會寫:
(*sb).Append()
通常縮寫為sb->Append()
。現在我們已經非常接近C#了,因為你可以認為在C#中,->
運算符也寫成了.
。只是編譯器足夠“聰明”,可以知道member-access運算符的左側是引用類型還是值類型。