2016-05-16 74 views
0

我想向System.Drawing.RectangleF類添加額外的複製構造函數,該構造函數需要另一個RectangleF作爲其唯一參數。將構造函數添加到C#系統類

我試着在System.Drawing命名空間中創建一個部分類,它給了我一個命名空間衝突。我嘗試使用擴展類來實現它,並且不會將其視爲構造函數。

回答

3

RectangleF的情況下,你沒有真正做任何事情,因爲RectangleF結構,因此它具有值語義。將Rect分配給變量會複製其內容。

看看下面的示例代碼:

RectangleF a = new RectangleF(1, 2, 3, 4); 
Console.WriteLine(a); 
RectangleF b = a; //a gets copied to b 
Console.WriteLine(b); 
a.X = 5; 
a.Y = 6; 
a.Width = 7; 
a.Height = 8; 
Console.WriteLine(a); 
Console.WriteLine(b); 

當你運行它,你會得到下面的輸出:

{X=1,Y=2,Width=3,Height=4} 
{X=1,Y=2,Width=3,Height=4} 
{X=5,Y=6,Width=7,Height=8} 
{X=1,Y=2,Width=3,Height=4} 

你可以看到的值複製到b,然後在修改a時b保持不變。如果RectangleF是一個實際的類,它將具有引用語義,最後兩行輸出將是相同的東西。

+0

我將此標記爲答案,因爲它確實解決了我的具體問題。然而,當我嘗試擴展內置類並想添加新構造函數時,知道是否有一個通用解決方案會很好。 – JKreft

+0

@JKreft:答案很簡單:不可能。 – whatsisname

0

我想你只能使用部分類功能,如果你有效擁有這個類。那就是你不能像這裏的情況那樣在另一個DLL中部分一個類。

RectangleF是一個結構,順便說一句,不是一個類,不是說這真的改變了任何東西。您可能會看到extension methods;你將無法定義構造函數,但你可以定義一個擴展方法,讓你這樣做的:

var newRectangleF = existingRectangleF.clone(); 

擴展方法可以跨DLL邊界限定,並且可以調用使用實例方法語法或靜態方法句法。它們與Visual Studio很好地配合,比如完成建議。


您還可能會發現MemberwiseClone()有趣。

+0

只有當你不需要訪問類的內部時,擴展方法纔會起作用,除非你打算調用一些反射魔法。 –

+0

我並不需要訪問內部實體,我打算只接受傳入的'RectangleF'並將'.Location'和'.Size'傳遞給內置的構造函數。 – JKreft