31.比较值类型的相等性
ReferenceEquals()用于比较引用,Equals()用于比较值。比较运算符可以看作一个中间项,但最大的区别是值类型需要装箱才能把它转化为引用。
32.比较运算符重载
语句if(a==b)对于类,这个语句在默认状态下会比较引用a和b,检测这两个引用是否指向内存中的同一个地址,而不是检测两个实例实际上是否包含相同的数据。
C#要求成对的重载运算符,比较运算符必须返回bool类型的值。
33.比较运算符:浅度比较与深度比较
如果有嵌入的类,浅度比较:比较引用是否指向同一个对象 深度比较:比较对象的值是否相等
34.基类和派生类之间的类型强制转换
在进行类型强制转换时,会检查被引用的对象,因为基类引用原则上可以引用一个派生类的实例,如果该对象不是派生类的一个实例,强制转换就会失败。
35.委托
委托是类型安全的类,它定义了返回类型和参数的类型,委托类不仅包含对方法的引用,也可以包含对多个方法的引用。
当参数是委托类型时,就可以使用lambda表达式实现委托引用的方法。
当要把方法传送给其他方法时,需要使用委托。
36.声明委托
使用委托时,首先必须定义要使用的委托,必须创建该委托的一个或多个实例。定义的前面加上关键字delegate,
37.委托推断
为了减少输入量,只要需要委托实例,就可以只传送地址的名称。委托推断可以在需要委托实例的任何地方使用,也可以用于事件,因为事件基于委托。
38.泛型Action<T>委托表示引用一个void返回类型的方法,这个委托存在不同的变体,可以传递至多16种不同的参数类型。没有泛型参数的Action类可以调用没有参数的方法。
39.多播委托
如果要调用多个方法,就需要多次显式调用这个委托。但是,委托也可以包含多个方法。这种委托称为多播委托。如果调用多播 委托,就可以按顺序连续调用多个方法。为此,委托的签名就必须返回void
40.GetInvocationList()
为了避免因为前面方法抛出异常,导致迭代停止,可以自己迭代方法列表。delegate类定义GetInvocationList()方法,它返回一个Delegate对象数组。使用这个委托调用捕获异常,继续下一次迭代。
41.闭包和lambda表达式
通过lambda表达式可以访问lambda表达式块外部的变量,称为闭包。
若要创建 Lambda 表达式,需要在 Lambda 运算符 => 左侧指定输入参数(如果有),然后在另一侧输入表达式或语句块。 例如,lambda 表达式 x => x * x 指定名为 x 的参数并返回 x