2014-03-30 107 views
3
public static class RectangleExtension 
{ 
    public static Rectangle Offseted(this Rectangle rect, int x, int y) 
    { 
     rect.X += x; 
     rect.Y += y; 
     return rect; 
    } 
} 


.... 

public void foo() 
{ 
    Rectangle rect; 

    rect = new Rectangle(0, 0, 20, 20); 
    Console.WriteLine("1: " + rect.X + "; " + rect.Y); 

    rect.Offseted(50, 50); 
    Console.WriteLine("2: " + rect.X + "; " + rect.Y); 

    rect = rect.Offseted(50, 50); 
    Console.WriteLine("3: " + rect.X + "; " + rect.Y); 
} 

輸出:C#呼叫

1:0; 0

2:0; 0

3:50; 50

我的預期:

1:0; 0

2:50; 50

爲什麼rect.Offseted(50,50)不能修改步驟2中矩形的x和y?

我需要用我的RectangleExtension方法來獲得預期的結果?

+0

(參照RECT).Offseted(50,50); –

回答

2

答案是:structs總是按C#中的值傳遞,而您的情況中的Rectangle是struct而不是class

嘗試這種情況:

public class A { 
    public int x; 
} 
public struct B { 
    public int x; 
} 
public static class Extension { 
    public static A Add(this A value) { 
     value.x += 1; 
     return value; 
    } 
    public static B Add(this B value) { 
     value.x += 1; 
     return value; 
    } 
} 
class Program { 
    static void Main(string[] args) { 
     A a = new A(); 
     B b = new B(); 
     Console.WriteLine("a=" + a.x); 
     Console.WriteLine("b=" + b.x); 
     a.Add(); 
     b.Add(); 
     Console.WriteLine("a=" + a.x); //a=1 
     Console.WriteLine("b=" + b.x); //b=0 
     Console.ReadLine(); 
    } 
} 
+0

謝謝!我不知道矩形是一個結構... – Felix

+1

這只是一個例子,爲什麼很多人說[可變結構是邪惡的](http://stackoverflow.com/questions/441309/why-are-mutable-structs-邪惡)。這與延伸方法無關。通常的方法會發生同樣的情況,其中'rect'是一個值參數。類型['System.Drawing.Rectangle'](http://msdn.microsoft.com/en-us/library/system.drawing.rectangle.aspx)被設計爲一個邪惡的結構(對於.NET 1.0)。也可以嘗試'list [0] .Offset(50,50);''Offset'是'Rectangle'中的實例方法(BCL附帶),'list'是'List '。 'List <>'有一個索引器。 –