运算符重载
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#中的相等:
==
有的类型定义了,有的类型没有定义,程序员可以重载Equals
是object
类的虚函数,被所有类继承
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();
}
讲太快课件版本又不一样这里突然给我干懵逼了😓