C#的operator运算符定义
自定义类型可以使用operator扩展,如显式类型转换、隐式类型转换、操作符重载等,可以让我们的自定义类和C#提供的类型操作尽可能保持一致,简化逻辑代码。
private void button4_Click(object sender, EventArgs e){ParamA paramA = (ParamA)0x1A2B3C4D;paramA++;Trace.Assert(paramA.First8Bit == 0x1A + 1);Trace.Assert(paramA.Second8Bit == 0x2B + 1);Trace.Assert(paramA.Third8Bit == 0x3C + 1);Trace.Assert(paramA.Last8Bit == 0x4D + 1);ParamA paramB = (ParamA)0x01010101;var parramC = paramA + paramB;Trace.Assert(parramC.First8Bit == 0x1A + 2);Trace.Assert(parramC.Second8Bit == 0x2B + 2);Trace.Assert(parramC.Third8Bit == 0x3C + 2);Trace.Assert(parramC.Last8Bit == 0x4D + 2);Trace.Assert(paramA != paramB);}public class ParamA{public byte First8Bit { get; set; }public byte Second8Bit { get; set; }public byte Third8Bit { get;set; }public byte Last8Bit { get; set; }/// <summary>/// 隐式类型转换定义 从int得到ParamA实例/// ParamA paramA = 0x1A2B3C4D;/// 和显式类型转换二选一/// </summary>//public static implicit operator ParamA(int value)//{// return new ParamA { First8Bit = (byte)(value >> 24), Second8Bit = (byte)((value >> 16) & 0xFF), Third8Bit = (byte)((value >> 8) & 0xFF), Last8Bit = (byte)(value & 0xFF) };//}//ParamA paramA = 0x1A2B3C4D;/// <summary>/// 显式类型转换定义 从int得到ParamA实例/// ParamA paramA = (ParamA)0x1A2B3C4D;/// 和隐式类型转换二选一/// </summary>/// <param name="value"></param>public static explicit operator ParamA(int value) {return new ParamA { First8Bit = (byte)(value >> 24), Second8Bit = (byte)((value >> 16) & 0xFF), Third8Bit = (byte)((value >> 8) & 0xFF), Last8Bit = (byte)(value & 0xFF) };}public static ParamA operator++(ParamA paramA){return new ParamA { First8Bit = (byte)(paramA.First8Bit + 1), Second8Bit = (byte)(paramA.Second8Bit + 1), Third8Bit = (byte)(paramA.Third8Bit + 1), Last8Bit = (byte)(paramA.Last8Bit + 1)};}public static ParamA operator+(ParamA paramA, ParamA paramB){return new ParamA { First8Bit = (byte)(paramA.First8Bit + paramB.First8Bit), Second8Bit = (byte)(paramA.Second8Bit + paramB.Second8Bit), Third8Bit = (byte)(paramA.Third8Bit + paramB.Third8Bit), Last8Bit = (byte)(paramA.Last8Bit + paramB.Last8Bit) };}public static bool operator==(ParamA paramA, ParamA paramB){return paramA.First8Bit == paramB.First8Bit&& paramA.Second8Bit == paramB.Second8Bit&& paramA.Third8Bit == paramB.Third8Bit&& paramA.Last8Bit == paramB.Last8Bit;}public static bool operator!=(ParamA paramA, ParamA paramB){return paramA.First8Bit != paramB.First8Bit|| paramA.Second8Bit != paramB.Second8Bit|| paramA.Third8Bit != paramB.Third8Bit|| paramA.Last8Bit != paramB.Last8Bit;}}