2013-02-27 73 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