相关文章推荐

”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;
        //比较自定义对象
        //重写Equals, 判断线段相等
        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;
        //重写了Equals函数,同时也必要重写GetHashCode函数
        //判断Equals时,两个对象的GetHashCode()返回值相等是且Equals()函数的必要条件
        //即:GetHashCode()返回值相等,且Equals()函数体内部逻辑返回值为true,则Equals()返回true
        //重写GetHashCode
        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);
        //扩展,重写ToString,自定义Log输出的格式内容
        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
        //对比值类型:
        //”==“ 与 ”Equals“ 一样,都是对比变量值
        //C#已经重写了string的”==“和”Equals“,对比结果与值类型一致
        //对比引用类型:
        //引用类型:内容存储在堆,堆地址存储在栈
        //”==“ 对比引用地址,即栈内存储的堆地址
        //”Equals“ 对比对象,即堆上存储的对象内容
        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));       //true
            Debug.Log(line01 == line02);        //true
            Debug.Log(overrideLineList.Contains(line02));    //true
            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));     //false
            Debug.Log(line03 == line04);     //false
            Debug.Log(normalLineList.Contains(line04));     //false
                    先说一下函数Equals和运算符"=="二者的区别:1. 对比值类型:”==“ 与 ”Equals“ 一样,都是对比变量值C#已经重写了string的”==“和”Equals“,对比结果与值类型一致2. 对比引用类型:引用类型:内容存储在堆,堆地址存储在栈”==“ 对比引用地址,即栈内存储的堆地址”Equals“ 对比对象,即堆上存储的对象内容举一个栗子来说明重写,...
				
C#中判断两个对象是否相等有Equals、RefrenceEquals和==三种,其中==为运算符,其它两个为方法,而Equals又有两种版本,一个是静态的,一个是虚拟的,虚拟的可以被实体类重写,静态的在方法体内也是调用虚拟的,如下: 代码如下: public static bool Equals(object objA, object objB) { return ((objA == objB) || (((objA != null) && (objB != null)) && objA.Equals(objB))); } public virtual bool Equals(object
public Name(String first, String last) { if (first == null || last == null) throw new NullPointerException(); this.first = first; this.last = la... 结果:在C#中对于值类型的比较不管是用【==】还是【equals】都是对于其内容的比较,也就是说对于其值的比较,相等则返回true 不相等则返回false;引用类型: string 类型: 但是对于除string类型以外的引用类型 【==】比较的是在对象在栈上的引用是否相同而【equals】则比较的是对象在堆上的内容是否相同 结果:而当我定义两个object 引用指向两个string变量时再进行比较
每天学习一点点,然后做练习巩固下 注意不管是重写运算符还是 自定义类型转换,都必须写在 被操作的类里面,基于这条规定,想把重写运算符写成工具类,是不能够的. 工具类是被抽象出来的类,和想要操作的对象或类不相同. 重写运算符方法或自定义类型转换方法或报错. using System.Collections; using System.Collections.Generic; using UnityE...
什么是重写(override)? “重写”是指“覆盖在某物之上”=“覆盖”。这是一个与继承密切相关的功能。 重写应重新定义父类方法。当您要更改继承的类中父方法的处理时使用。 public class Sample public virtual void Test() // 处理A class Sample2 : Sample public override void Test() // 处理B 在上述情况下,由于Sample2类继
用关键字 virtual 修饰的方法,叫虚方法。可以在子类中用override 声明同名的方法,这叫“重写”。相应的没有用virtual修饰的方法,我们叫它实方法。重写会改变父类方法的功能。 在子类中用 new 关键字修饰 定义的与父类中同名的方法,叫覆盖。 覆盖不会改变父类方法的功能。 示例代码:(C# 控制台程序) using Syst... 【问题记录】Unity打包iOS报错 Invalid SWIFT_VERSION / Invalid Bundle. The bundle at ‘***.app··· CSDN-Ada助手: AI 写作助手上线啦!限免 4 天,快来创作试试功能吧~https://editor.csdn.net/md/?not_checkout=1&utmsource=blog_comment_recall 【Unity】OnCollisionEnter、OnTriggerEnter与其子物体的联系 年轻且直溜: 好,一直疑惑,一会试试。 【UnityEditor】创建并保存 Texture图片、Mesh网格 萧然CS: https://z-c-s.blog.csdn.net/article/details/110918582 可以参照这个 【UnityEditor】创建并保存 Texture图片、Mesh网格 MoYan1082: 怎么保存prefab呢? 【Unity】问题记录:Animation must be marked as Legacy 萧然CS: 这是动画自身的原因了,Unity里制作的动画,直接改成旧版是没问题的,外部导入的动画没有试过··· 【问题记录】Unity打包iOS真机闪退,报错Error loading ***.app/Frameworks/UnityFramework.framework/UnityFramework 【问题记录】Unity打包Android,添加VIBRATE权限后,还是会有报错SecurityException: Requires VIBRATE permission
 
推荐文章