[关闭]
@sharif 2018-02-26T12:00:12.000000Z 字数 2832 阅读 927

CH11.2 比较

Ch11 Ch11.2 is as 比较


目录


类型比较

1.获取对象类型

GetType()和typeof()一起使用就可以确定对象的类型

2.封箱和拆箱

boxing是把值类型转换为System.Object类型,或者转换为由值类型实现的接口类型。unboxing是相反的过程。

  1. //假定MyStruct类型实现IMInteface接口
  2. interface IMyInterface{}
  3. struct MyStruct : IMyInterface
  4. {
  5. public int val;
  6. }
  7. //把结构封箱到IMyinterface类型中
  8. Mystruct valType1 = new Mystruct();
  9. IMyInterface refType = valType1;
  10. //拆箱
  11. MyStruct valType2 = (MyStruct)refType;

封箱是在没有用户干涉的情况下进行的(不需要任何代码),但拆箱一个值需要进行显式转换

3.is运算符

(1)概念解释

is运算符并不是用来说明对象是某种类型,而是用来检查是不是给定类型,或者是否可以转换为给定类型,如果是,返回 true。
is和==的区别在于,前一个是属于,后一个是等于。

(2)语法

  1. <operand> is <type>

(3)表达式结果

类型 return true
类类型 相同类类型 或者继承该类型或者封箱到该类型中
接口类型 相同类类型 或者实现了该接口的类型
值类型 相同类类型 或者可以拆箱到该类型中

值比较

1.运算符重载(operator overloading)

(1)运算符重载基本语法

  1. public class AddClass1
  2. {
  3. public int val;
  4. public static AddClass1 operator +(AddClass op1, AddClass op2)
  5. {
  6. AddClass1 returnVal = new AddClass1();
  7. returnVal.val = op1.val + op2.val;
  8. return returnVal;
  9. }
  10. }

(2)可重载的运算符

种类 具体
一元运算符 +,-,!,~,++,--,true,false
二元运算符 +,-,*,/,%,&,|,^,\<<,>>
比较运算符 ==,!=,<,>,<=,=>

(3)重载注意事项

  1. 不能重载赋值运算符;
  2. 也不能重载&&和||;
  3. 一些运算符必须成对重载;
  4. 对于==和!=运算符通常需要重写Object.Equals()和Object.GetHashCode()函数,以保证其重载的完整性。

    • Object.Equals(),以Object对象为参数
      说明:Windows 运行时用 C# 或 Visual Basic 编写的类可以重写Equals(Object)方法重载

      ※Equals()与==的区别:

      1. 对于值类型来说 两者是相同的 都是比较的变量的值
      2. 对于引用类型来说,等号(==)比较的是两个变量的”引用”是否一样,即是引用的”地址”是否相同。而对于equals来说仍然比较的是变量的 ”内容” 是否一样
    • Object.GetHashCode()函数:获取对象实例的一个唯一int值

  1. public override bool Equals(Object op1)
  2. {
  3. if(op1 is AddClass1)
  4. {
  5. return val == ((AddClass1)op1).val;
  6. }
  7. else
  8. {
  9. //操作数类型有误,或者不能转换为正确类型,就会抛出一个异常
  10. throw new ArgumentException("Cannot compare AddClass1 objects with objects of type " + op1.GetType().ToString());
  11. }
  12. }
  13. public override int GetHashCode() => val;

2.IComparable和IComparer接口

(1)IComparable和IComparer接口是.NET Framework中比较对象的标准方式。
(2)两者的区别:
* IComparable在要比较的对象类中实现,可以比较该对象和另一个对象。
* IComparer在一个单独的类中实现,可以比较任意两个对象
(3)一般使用IComparable给出默认的比较代码,使用其他类给出非默认的比较代码。
(4)IComparable提供了一个方法ComparaTo(),接受对象,返回比较结果【int值】。
(5)IComparer提供方法Compare()。接受两个对象,返回一个整型结果。

  1. string s = "12346";
  2. string m = "2356";
  3. Console.WriteLine($"{Comparer.Default.Compare(s,m)}");

3.对集合排序

ArrayList包含Sort()方法

  1. //Person.cs
  2. Class Person : IComparable
  3. Field string Name
  4. Field int Age
  5. Method public Person(string name, int age) //构造函数
  6. Method int CompareTo(Object obj)//接口中的比较函数,返回年龄差距
  7. //PersonComparerName.cs
  8. Class PersonComparerName : IComparer
  9. Method public static IComparer Default = new PersonComparerName;
  10. Method public int Compare(object x,object y)
  11. //Program.cs
  12. ArrayList list = new ArrayList();
  13. list.Add(new Person("Rual",30);
  14. ...
  15. list.Sort();//两种排序方式
  16. list.Sort(PersonComparerName.Default);

以上代码中两种排序,
第一种调用默认的排序,即CompareTo()函数,可以根据自己的需求改变即CompareTo()函数;
第二种则不然,有公共的静态字段,方便使用,具体Compare(object x,object y)函数如下:

  1. public int Compare(object x,object y)
  2. {
  3. if(x is Person && y is Person)
  4. return Comparer.Default.Compare(((Person)x).Name, ((Person)y).Name);
  5. else
  6. throw new ArgumentException("一个或者两个都不是Person对象。");
  7. }

英文单词

单词 释义
class
struct 结构
property 属性
method 方法
fields 字段
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注