C#_操作符重载

时间:2021-11-10 17:48:54
  • 操作符重载

语法箱:

public static <Return_Type> operator <Operator_symbol> (<Type> <Formal_parameter1> [, <Type> <Formal_parameter2>])

{

<Statements>

}

其中:

<Operator_symbol>

::= (one of the unary operations:) + – ! ~ ++ – true false

::= (one of the binary operators:) + – * / % & | ^ << >> == != < > <= >=

注释:

  1. 只有这里指定的操作符才能重载
  2. <Return_Type> 可以为除void以外的任意类型,但操作符true和false及所有的比较操作符必须是返回一个布尔值。
  3. 如果重载比较操作符(<, <= 或 ==)之一,必须同时重载与之对应的操作符(>, >= 或!=)。
  4. 一个操作符的优先级和结合性不能更改。

例如:

public static TimeSpan operator+ (TimeSpan timeSpan1, TimeSpan timeSpan2)

{

   TimeSpan sumTimeSpan = new TimeSpan();

   sumTimeSpan.Seconds = timeSpan1.Seconds + timeSpan2.Seconds;

   return sumTimeSpan;

}

public static bool operator> (TimeSpan timeSpan1, TimeSpan timeSpan2)

{

return (timeSpan1.Seconds > timeSpane2.Seconds);

}

注释:

Seconds是用户自定义类TimeSpan中的类型为uint的属性。

 

  • 用户自定义隐式和显式转换

隐式转换语法箱:

public static  implicit  operator <Type_convert_to> ( <Type_convert_from> <Parameter_identifier>)

{

<Statements>

}

显式转换语法箱:

public static explicit operator <Type_Convert_to> (<Type_convert_form> <Parameter_identifier>)

{

<Statements>

}

注释:

安全起见,用户一般只指定隐式转换即可即简单类型之间没有数据丢失危险的转换(like uint to uint)。如果存在这样的隐患时(uint to ushort),就要强迫使用类型转换操作符执行显式转换。

例如:

public static explicit operator ushort (TimeSpan convertFrom)

{

     return (ushort) convertFrom.TotalSeconds;

}

public static void Main()

{

     ushort simpleTimeSeconds;

     TimeSpan myTime = new TimeSpan(130);

     simpleTimeSeconds = (ushort) mytime;

}