首页 分享 【C#】重写Equals与运算符“==“及二者区别

【C#】重写Equals与运算符“==“及二者区别

来源:萌宠菠菠乐园 时间:2025-04-13 12:57

最新推荐文章于 2024-05-26 08:48:07 发布

萧然CS 于 2018-10-27 16:57:03 发布

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

先说一下函数Equals和运算符"=="二者的区别:

1. 对比值类型:

”==“ 与 ”Equals“ 一样,都是对比变量值

C#已经重写了string的”==“和”Equals“,对比结果与值类型一致

2. 对比引用类型:

引用类型:内容存储在堆,堆地址存储在栈

”==“ 对比引用地址,即栈内存储的堆地址

”Equals“ 对比对象,即堆上存储的对象内容

举一个栗子来说明重写,需要的可以按此方式扩展啦~

一条2D线段,用起点终点来表示,判断线段相等需要判断起点终点都相等,这个比较简单,就不上代码啰嗦啦。重点是通过重写Equals函数,更方便的实现判断。

//定义线段类

class OverrideLine

{

public Vector2 A { get; private set; }

public Vector2 B { get; private set; }

public OverrideLine(Vector2 pointA, Vector2 pointB)

{

A = pointA;

B = pointB;

}

public override bool Equals(object obj)

{

if (obj is OverrideLine)

{

var edge = (OverrideLine)obj;

return (edge.A == A && edge.B == B) || (edge.B == A && edge.A == B);

}

return false;

}

public override int GetHashCode()

{

return A.GetHashCode() ^ B.GetHashCode();

}

public static bool operator ==(OverrideLine line01, OverrideLine line02)

{

return line01.Equals(line02);

}

public static bool operator !=(OverrideLine line01, OverrideLine line02)

{

return !(line01 == line02);

}

public override string ToString()

{

return string.Format("[" + A + "->" + B + "]");

}

}

//在定义一个普通的类,以作对比

class NormalLine

{

public Vector2 A { get; private set; }

public Vector2 B { get; private set; }

public NormalLine(Vector2 pointA, Vector2 pointB)

{

A = pointA;

B = pointB;

}

}

//接下来打印一下对比结果

public class OverrideEquals : MonoBehaviour

{

void Start()

{

OverrideLine line01 = new OverrideLine(Vector2.zero, Vector2.one);

OverrideLine line02 = new OverrideLine(Vector2.zero, Vector2.one);

List<OverrideLine> overrideLineList = new List<OverrideLine>();

overrideLineList.Add(line01);

Debug.Log(line01.Equals(line02));

Debug.Log(line01 == line02);

Debug.Log(overrideLineList.Contains(line02));

NormalLine line03 = new NormalLine(Vector2.zero, Vector2.one);

NormalLine line04 = new NormalLine(Vector2.zero, Vector2.one);

List<NormalLine> normalLineList = new List<NormalLine>();

normalLineList.Add(line03);

Debug.Log(line03.Equals(line04));

Debug.Log(line03 == line04);

Debug.Log(normalLineList.Contains(line04));

}

}

相关知识

c#中字符串比较,==,!=,Compare,Equals的区别
Java 中 == 和 equals() 区别
(4)C# 基础 ——运算符的使用
Java学习day11
==的作用
C# 重载运算符
“==”和“equals”有的时候和你想象的不一样
建议11: 区别对待==和Equals
C#中 ??、 ?、 ?: 、?.、?[ ]
狸花猫和美短的区别,二者的外观与性格详细解析

网址: 【C#】重写Equals与运算符“==“及二者区别 https://www.mcbbbk.com/newsview1114877.html

所属分类:萌宠日常
上一篇: ./configure
下一篇: 欢乐堆积木VS宠物进化冒险手游

推荐分享