簡體   English   中英

為什么 System.Drawing Rectangle、Point、Size 等是可變結構而不是類?

[英]Why are System.Drawing Rectangle, Point, Size etc mutable structs and not classes?

微軟決定制作這些結構有什么原因嗎?

這三個都是可變的。 如果它們是不可變的,或者如果它們是引用類型,我會發現它們更容易處理。

如果有理由它們必須是結構體,為什么它們是可變的?

為什么是結構體

值語義
這些值的兩個相同實例之間沒有本質區別。 任何具有坐標的Point[2,3]等於具有相同坐標的任何其他點,就像任何兩個具有相似值的int相等一樣。 這符合設計指南:

它在邏輯上表示單個值,類似於原始類型(整數、雙精度等)。

表現

分配和釋放值類型的成本更低。

通常需要創建這些值的許多實例。 結構體的創建成本較低,如果它們是本地值,它們將在堆棧上創建,從而減輕 GC 的壓力。

尺寸
讓我們考慮這些值的大小:
Point :8個字節
Size :8 字節
Rectangle :16 字節

對於PointSize ,它們的大小與在 64 位系統中對類實例的引用相同。

引自 Microsoft 指南: 在類和結構之間進行選擇

為什么它們是可變的

這些結構是完全可變的。 這樣做是為了性能(違反准則),因為它避免了為修改操作創建新值的需要。

關於評論中的 OP 代碼示例:

Point[] points = new Point[] { new Point(0,0), new Point(1,1), new Point(2,2) };

foreach (Point p in points)
{
    p.X += 1; 
}

這個foreach失敗的唯一原因是因為p裝箱object以提供迭代,並且您Cannot modify the result of an unboxing conversion (感謝 Rajeev)迭代器按值返回數據,您只會進行更改到值的副本

這工作正常:

for (int i = 0; i < points.Length; i++)
{
    points[i].X += 1;
}

Microsoft 不需要將這些結構定義為一個類。

這些基本上都是小型結構。

如果這些被定義為一個class ,對於Point結構,相同的坐標可以引用內存中的不同對象。 定義為struct ,我們知道具有相同坐標的不同點之間沒有區別。 這意味着它們是值類型。 分配值類型幾乎總是更便宜。 看看它們的大小;

Point : 8 bytes
Size: 8 bytes
Rectangle: 16 bytes

誰想在每次創建Point(1,2)時分配一個新的內存部分?

暫無
暫無

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

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