[英]Why are System.Drawing Rectangle, Point, Size etc mutable structs and not classes?
微軟決定制作這些結構有什么原因嗎?
這三個都是可變的。 如果它們是不可變的,或者如果它們是引用類型,我會發現它們更容易處理。
如果有理由它們必須是結構體,為什么它們是可變的?
值語義
這些值的兩個相同實例之間沒有本質區別。 任何具有坐標的Point
, [2,3]
等於具有相同坐標的任何其他點,就像任何兩個具有相似值的int
相等一樣。 這符合設計指南:
它在邏輯上表示單個值,類似於原始類型(整數、雙精度等)。
表現
分配和釋放值類型的成本更低。
通常需要創建這些值的許多實例。 結構體的創建成本較低,如果它們是本地值,它們將在堆棧上創建,從而減輕 GC 的壓力。
尺寸
讓我們考慮這些值的大小:
Point
:8個字節
Size
:8 字節
Rectangle
:16 字節
對於Point
和Size
,它們的大小與在 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
失敗的唯一原因是因為 (感謝 Rajeev)迭代器按值返回數據,您只會進行更改到值的副本。p
被裝箱為object
以提供迭代,並且您Cannot modify the result of an unboxing conversion
,
這工作正常:
for (int i = 0; i < points.Length; i++)
{
points[i].X += 1;
}
這些基本上都是小型結構。
Rectangle Structure
存儲一組四個整數。Point Structure
表示一對有序的整數 x 和 y 坐標。Size Structure
存儲一對有序的整數。 如果這些被定義為一個class
,對於Point
結構,相同的坐標可以引用內存中的不同對象。 定義為struct
,我們知道具有相同坐標的不同點之間沒有區別。 這意味着它們是值類型。 分配值類型幾乎總是更便宜。 看看它們的大小;
Point : 8 bytes
Size: 8 bytes
Rectangle: 16 bytes
誰想在每次創建Point(1,2)
時分配一個新的內存部分?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.