為什么C#語法處理ptr=null與C++中的指針解引用不同?

在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++中,你會寫:

StringBuilder* sb = new StringBuilder();
(*sb).Append(...);
sb = nullptr; // well, rather delete first, but we don't care here.

(*sb).Append()通常縮寫為sb->Append()。現在我們已經非常接近C#了,因為你可以認為在C#中,->運算符也寫成了.。只是編譯器足夠“聰明”,可以知道member-access運算符的左側是引用類型還是值類型。

主站蜘蛛池模板: 国产午夜精品一区二区| 成人日韩熟女高清视频一区| 亚洲视频一区调教| 日韩精品一区二区三区视频| 无码国产精品一区二区免费3p| 在线观看一区二区三区视频| 日韩精品无码一区二区三区不卡| 中文字幕一区二区人妻性色 | 国产午夜精品一区二区三区小说| 日本一区频道在线视频| 色欲AV蜜臀一区二区三区| 国产在线精品一区二区中文| 中文字幕无线码一区| 久久亚洲中文字幕精品一区| 亚洲av无码天堂一区二区三区| 免费萌白酱国产一区二区 | 日本一区精品久久久久影院| 国模大尺度视频一区二区| 久99精品视频在线观看婷亚洲片国产一区一级在线 | 亚洲一区爱区精品无码| 国产内射999视频一区| 亚洲毛片αv无线播放一区| 红桃AV一区二区三区在线无码AV | 国产拳头交一区二区| 日本一区二区三区在线观看视频| 色窝窝免费一区二区三区| 在线观看中文字幕一区| 国产一区二区精品在线观看| 麻豆视频一区二区三区| 日本美女一区二区三区| 亚洲国产精品一区二区第四页| 久久久国产一区二区三区| 国产av成人一区二区三区| 午夜福利一区二区三区高清视频| 性色AV一区二区三区| 日本一区频道在线视频| 国产熟女一区二区三区五月婷| 一区三区三区不卡| 国产成人久久精品一区二区三区 | 波多野结衣一区在线| 免费萌白酱国产一区二区三区|