2013-02-27 116 views
0

當我輸入的問題,我可以看到運營商清單列表問題排隊。他們大多數都是C++或Haskell。我的問題是針對C#,可以說邏輯可能是一樣的。而我的問題是我想了解運算符在C#上下文中的重載。運營商超載的類型

我一直在尋找一個教程,它表明,

DateTime dt1 = new DateTime(); 
//do some work 
DateTime dt2 = new DateTime(); 
TimeSpan ts = dt2 - dt1; 

而且對筆者說,datetime數據類型中的-利用是最好的運算符重載的例子。我只能看到一個日期被另一個日期所減去,並保存到TimeSpan對象中。它不使用operator關鍵字和static關鍵字。

我覺得很難理解。有人可以解釋這裏發生了什麼嗎?這是否意味着在ts = dt2 - dt1之下,會有public static DateTime operator -(DateTime, DateTime)發生?

更新:

第二個例子:

//some parameterized constructor is here to set X, Y 

public static Point operator +(Point p1, Point p2) 
{ 
    Point p = New Point(); 
    p.X = p1.X + p2.X; 
    p.Y = p2.Y + p2.Y; 
    return p 
{ 

在這種情況下,操作數必須是同一類型的返回類型?使用它時時宣佈重載的運算符,而不是

+0

Look [here](http://msdn.microsoft.com/en-us/library/aa288467(v = vs.71).aspx) – 2013-02-27 15:56:07

回答

9

operator關鍵字使用。

因此,運營商將被寫成這樣:

public static TimeSpan operator -(DateTime lhs, DateTime rhs) 
{ 
    // Code to execute 
} 

這些都不妨礙當你使用運營商 - 你只是用它在你已經表現出來的那種代碼。所以這一行:

TimeSpan ts = dt2 - dt1; 

將調用上面給出的代碼。

示例代碼:

using System; 

public class Int32Wrapper 
{ 
    private readonly int value; 
    public int Value { get { return value; } } 

    public Int32Wrapper(int value) 
    { 
     this.value = value; 
    } 

    public static Int32Wrapper operator +(Int32Wrapper lhs, Int32Wrapper rhs) 
    { 
     Console.WriteLine("In the operator"); 
     return new Int32Wrapper(lhs.value + rhs.value); 
    } 
} 

class Test 
{ 
    static void Main() 
    { 
     Int32Wrapper x = new Int32Wrapper(10); 
     Int32Wrapper y = new Int32Wrapper(5); 
     Int32Wrapper z = x + y; 
     Console.WriteLine(z.Value); // 15 
    } 
} 

要回答你的問題的最後一位:

這是否意味着上述ts = dt2 - dt1下,有一個public static DateTime operator -(DateTime, DateTime)發生了什麼?

無 - 有沒有DateTime減法運算符返回DateTime - 但只是返回TimeSpan之一。

編輯:關於你的第二個例子Point,我認爲將兩個Point值加在一起並不合乎邏輯。例如,如果您將家庭位置添加到工作地點,您會得到什麼?它更有道理有Vector類型,然後:

public static Vector operator -(Point p1, Point p2) 
public static Vector operator +(Vector v1, Vector v2) 
public static Point operator +(Point p1, Vector v1) 
+0

謝謝。但是,TimeSpan與DateTime的數據類型不同... – aspiring 2013-02-27 15:57:27

+1

@aspiring:不,但是誰說過它必須是?操作符必須在其中一個操作數的類型中聲明,就這些了。 (或者對於轉換操作符,它可以是源類型或目標類型。) – 2013-02-27 15:59:37

+0

***操作符必須在其中一個操作數的類型中聲明,這就是全部。***這確實是有價值的信息。我看到的每個示例都顯示了相同的返回類型和操作數類型。我可以總結出'TimeSpan'和'DateTime'的特殊情況嗎?作爲我的第二個例子'Point'跟着'return type'跟'operands'一樣... – aspiring 2013-02-27 16:13:05

0

所有的運營商,是一個方法的語法糖。例如 - 運算符可以somethign類似

//not the actual syntax 
public MyObject minus(MyObject object1, MyObject object2) 
{ 
    //insert custom subtraction logic here 
    return result 
} 

可以重載運營商爲你定義的任何自定義類。

here's a tutorial I found on you actually do it

下面是本教程

// Declare which operator to overload (+), the types 
    // that can be added (two Complex objects), and the 
    // return type (Complex): 
    public static Complex operator +(Complex c1, Complex c2) 
    { 
     return new Complex(c1.real + c2.real, c1.imaginary + c2.imaginary); 
    } 
3

假設你有一個類 「金額」,像這樣的第一例的主要SNIPPIT:

public class Amount 
{ 
    public int AmountInt { get; set; } 
} 

而且你有兩個該類別的實例:

Amount am1 = new Amount { AmountInt = 2 }; 
Amount am2 = new Amount { AmountInt = 3 }; 

你不能簡單地做:

Amount am3 = am1 + am2; //compilation error 

你要操作添加到金額類,以提供此功能:

public static Amount operator +(Amount amount1, Amount amount2) 
{ 
    return new Amount { AmountInt = amount1.AmountInt + amount2.AmountInt }; 
} 

也是一樣的減( - )。現在如果你這樣做:

Amount am3 = am1 + am2; 

在這種情況下,am3的int值屬性將爲5。希望這可以幫助!

+0

謝謝,另一個可破譯的例子:) – aspiring 2013-02-27 16:19:34