南阳做做网站,贸易公司介绍模板,集团做网站方案制作包含哪些方面,电子商务网站开发相关技术简介
运算符重载是 C# 提供的一种特性#xff0c;允许开发者为 自定义类型#xff08;类/结构体#xff09; 定义运算符的行为。
例如#xff0c;可以让 Vector 对象支持 运算#xff0c;而不是仅限于基本类型#xff08;int、double 等#xff09;。
#x1f4a1; 本…简介运算符重载是C#提供的一种特性允许开发者为 自定义类型类/结构体 定义运算符的行为。例如可以让Vector对象支持 运算而不是仅限于基本类型int、double等。 本质运算符重载是一个 带有operator关键字的静态方法通过自定义方法改变运算符的操作行为。适用范围与限制特性说明可重载的类型类class和结构体struct不可重载的类型接口、枚举、委托方法修饰符必须是public static至少一个自定义类型运算符的参数中至少有一个必须是用户自定义类型不能重载的运算符.成员访问、?:条件运算符、new、is、as、typeof、sizeof、,,-但可以间接重载支持重载的运算符分类运算符一元运算符-!~--truefalse二元运算符-*/%比较运算符!必须成对重载如重载则必须重载!转换运算符implicit隐式转换explicit显式转换基本语法publicstatic返回类型operator运算符(参数列表){// 自定义逻辑}operator关键字定义运算符。参数中至少有一个是当前类/结构体。建议返回新的对象保持不可变性。常见示例重载二元运算符创建一个二维向量类publicstructVector{publicdoubleX{get;}publicdoubleY{get;}publicVector(doublex,doubley)(X,Y)(x,y);publicstaticVectoroperator(Vectora,Vectorb)newVector(a.Xb.X,a.Yb.Y);publicoverridestringToString()$({X},{Y});}// 使用varv1newVector(1,2);varv2newVector(3,4);Console.WriteLine(v1v2);// 输出: (4, 6)重载一元运算符-publicstaticVectoroperator-(Vectorv)newVector(-v.X,-v.Y);varvnewVector(5,-3);Console.WriteLine(-v);// 输出: (-5, 3)重载比较运算符, !比较向量是否相等publicstaticbooloperator(Vectora,Vectorb)a.Xb.Xa.Yb.Y;publicstaticbooloperator!(Vectora,Vectorb)!(ab);// 建议同时重写 Equals 和 GetHashCodepublicoverrideboolEquals(object?obj)objisVectorvthisv;publicoverrideintGetHashCode()HashCode.Combine(X,Y);重载时 必须 同时重载!。Equals和GetHashCode也要同步实现保证一致性。重载递增/递减运算符/–publicstaticVectoroperator(Vectorv)newVector(v.X1,v.Y1);publicstaticVectoroperator--(Vectorv)newVector(v.X-1,v.Y-1);转换运算符implicit/explicit在Vector和double之间转换publicstaticimplicitoperatordouble(Vectorv)Math.Sqrt(v.X*v.Xv.Y*v.Y);// 隐式转换为长度publicstaticexplicitoperatorVector(doubled)newVector(d,d);// 需要强制转换使用VectorvnewVector(3,4);doublelenv;// 隐式转换Vectorv2(Vector)5.0;// 显式转换逻辑运算符true/false用于自定义布尔逻辑publicstaticbooloperatortrue(Vectorv)v.X!0||v.Y!0;publicstaticbooloperatorfalse(Vectorv)v.X0v.Y0;VectorvnewVector(0,0);if(v)// 自动调用 operator trueConsole.WriteLine(非零向量);elseConsole.WriteLine(零向量);运算符与方法的关系运算符重载只是语法糖编译器会将运算符转换为静态方法调用varcab;// 等价于varcVector.op_Addition(a,b);常用方法映射运算符生成的方法名op_Addition-op_Subtraction*op_Multiply/op_Divisionop_Equality!op_Inequality综合示例复数类publicstructComplex{publicdoubleReal{get;}publicdoubleImag{get;}publicComplex(doublereal,doubleimag)(Real,Imag)(real,imag);publicstaticComplexoperator(Complexa,Complexb)newComplex(a.Realb.Real,a.Imagb.Imag);publicstaticComplexoperator-(Complexa,Complexb)newComplex(a.Real-b.Real,a.Imag-b.Imag);publicstaticComplexoperator*(Complexa,Complexb)newComplex(a.Real*b.Real-a.Imag*b.Imag,a.Real*b.Imaga.Imag*b.Real);publicstaticbooloperator(Complexa,Complexb)a.Realb.Reala.Imagb.Imag;publicstaticbooloperator!(Complexa,Complexb)!(ab);publicoverridestringToString()${Real}{Imag}i;}总结特性说明适用场景数学计算类向量、矩阵、复数、日期时间、坐标类关键规则public static、至少一个参数为自定义类型搭配使用Equals、GetHashCode、IComparable设计建议遵循语义一致性、返回新对象、与方法重载保持协调