2012-04-22 25 views
1

通過「直接」我的意思是這樣尺寸* 2(不工作),而不是:是否有直接的方法來乘以一個數字的大小或點?

size1 = new Size(size1.Width * 2, size1.Height * 2); 
+0

var newSize = size1 + size1 – Joe 2012-04-22 15:57:03

+0

@Joe,這並不是乘法,這是他所要求的。 Size類提供了靜態方法Add和Subtract,但沒有用於直接乘法。 – Chris 2012-04-22 15:58:45

回答

4

技術上可以編寫擴展方法:

public static class Extensions { 
    public static Size Multiply(this Size size, double factor) { 
     return new Size((int)(size.Width * factor), (int)(size.Height * factor)); 
    } 
} 

但幾乎沒有人會正確地使用它。他們會寫

this.Size.Multiply(1.2); 

,而不是需要

this.Size = this.Size.Multiply(1.2); 

一個幾乎不可避免的錯誤,因爲它看起來像一個實例方法。所以不要這樣做,只需編寫一個靜態輔助方法即可。

+0

謝謝。 – ispiro 2012-04-22 17:15:01

+0

擴展方法更好,因爲它比一些輔助方法更可重複使用且更容易發現。如果您擔心人們錯誤地使用它,請將其稱爲MultipliedBy。 – John 2017-03-27 00:13:39

0

不是沒有工作,但它是很容易超負荷運營商

看到demo of operator overloading on codeproject

見右底部:

public static MySize operator +(MySize mySize, Int32 value) 
{ 
    return new MySize(
     mySize.m_Width + value, 
     mySize.m_Height + value); 
} 

它不應該帶你長摸出*運算符重載

+0

除了Size是一個結構體,結構體不能作爲另一個結構體或類的基礎,所以不可能爲它重載操作符。 – Chris 2012-04-22 16:00:34

+0

如果你的猜測是正確的,大小是從.net類庫而不是他自己的混合物,那麼是的,你是正確的,缺乏一個凌亂的擴展方法,他被騙了 – 2012-04-22 16:06:26

3

可以重載運算符*:

class Size 
{ 
    public int Width { get; set; } 
    public int Height { get; set; } 

    public Size(int w, int h) 
    { 
     this.Width = w; 
     this.Height = h; 
    } 

    public static Size operator *(Size s, int n) 
    { 
     return new Size(s.Width * n, s.Height * n); 
    } 
} 

現在你可以這樣做:

Size s1 = new Size(1, 2); 
Size s = s1 * 2; // s.Height = 2, s.Width = 4 
+0

奇怪的是,我會選擇這個作爲正確的答案 – Steve 2012-04-22 17:23:24

+0

@Steve:也許OP使用.NET的內置'Size'結構,而不是他/她定義的類(這個問題不清楚)。在前一種情況下,不可能超載*運算符。 – Tudor 2012-04-22 17:47:29

2

由於是實現無*運營商Size struct你就必須創建一個。但通過擴展方法,不可能創建新的操作符。相反,您可以創建一個名爲multiply的擴展方法。

+0

這假定他使用System.Drawing.Size結構,而不是他自己的混合物 – 2012-04-22 16:07:48

+0

我假定他使用的是一個類/結構體,他不允許更改它的原始源代碼。如果它是他自己的類/結構體,則答案僅僅是實現*運算符。 – bubblez 2012-04-22 16:12:20

+0

+1感謝您的回答。 – ispiro 2012-04-22 17:13:25

相關問題