0%

C#操作符重载

C#运算符重载

运算符重载

C#也是支持运算符重载的

 

C++与C#

C++中:

public  Complex operator + (Complex a)
        { 
    return new Complex (real+a.real ,imaginary +a.imaginary );
}

C#中:

public static Complex operator + (Complex a)
    { 
    return new Complex (real+a.real ,imaginary +a.imaginary );
}

只能使用public static

 

相等

1.值相等——北京的山和上海的山都是山

2.地址相对——北京的山是北京的山,上海的山是上海的山

地址相对,肯定值相对;值相等,地址不一定相对

引用类型代表地址,值类型代表遍历本身。

C#中的指针已经不热衷于使用它了,所以在考虑地址相关的时候要让操作人员更加清晰。

C#中的相等

  • ==有的类型定义了,有的类型没有定义,程序员可以重载
  • Equalsobject类的虚函数,被所有类继承
public class C
    {
        public int i;
        public C(int pi)
        { this.i = pi; }
    } 

public struct S
{
public int i;
public S(int pi)
{ this.i = pi; }
}

int i = 1;
int j = 1;
bool f = (i == j);//true
f = (i.Equals(j));//ture
string m = "hello";
string n = "hello";
f = (m == n);//true
f = (m.Equals(n));//true
object g = m;
object h = n;
f=(g == h);//true
f=(g.Equals(h));//true
S s1=new S(1);
S s2=new S(1);
f=(s1==s2);//不支持==需要手工重载
f=(s1.Equals(s2));//true,值比较
C c1 = new C(1);
C c2 = new C(1);
f=(c1==c2);//false,地址不同
f=(c1.Equals(c2));//false,默认用的object的Equals也是比较地址


public static bool operator==(S s1,S s2){
return s1.i==s2.i;
}
public static bool operator!=(S s1,S s2){
return s1.i!=s2.i;
}//编译器要求同时重载!=

public override bool Equals(object?obj){
if(object.ReferenceEquals(this,obj))//使用object的静态函数判断地址是否相同
return true;
else{//如果不同则比较值
if(other==null) return false;
C?other=obj as C;//将obj类型变量转换成C类型
if(other.i==this.i) return true;
else return false;
}
}

//对于S,编译器会要求进行

 

summary

  • ==对于值类型比较值,对于引用类型比较是否是用一个对象的引用
  • Equals总是比较值
  • string是引用类型,但是与值类型类似

 

对于自定义class,按理说需要和C#默认的设置相同,但是可以通过这种方式将其改写。(需要同时改写==与!==)

出现警告CS0661——需要重写GetHashCode()函数

是有关GetHashCode()

一般情况下,哈希代码可以被所有对象获取,就是用过虚GetHashCode方法

如果两个类型相同的对象表示相同的值,则哈希函数必须为两个对象返回相同的常数值,这样的话,hash值相同,对象不一定相等

直接重写相等运算符,容易发生哈希冲突

哈希冲突会导致寻找新地址,从而导致运行速度会变慢,性能降低

如果能自己重写GetHashCode会更好

 public override int GetHashCode()
            {
                return this.real.GetHashCode();
            }

讲太快课件版本又不一样这里突然给我干懵逼了😓