装箱的背景在于值类型和引用类型的值不同:值类型的值就是值本身

时间:2022-03-22 04:00:12

通过对C#1所搭建的核心根本的深入了解,可以知道之后的C#版本在C#1的根本上做了很多扩展,而这些扩展都是基于C#搭建的核心根本而来的。

委托 一、编写委托的过程

委托经常和C语言的“函数指针”挂钩。委托是要领参数化、函数式语言一个重要的表达方法。C#1中编写一个委托要颠末四部:

1、声明委托类型

delegate void StringProcessor(string param1);

这个委托指定了一种无返回值,有一个string类型的参数的要领。

这个委托担任自System.MulticastDelegate,后者又派生自System.Delegate.

委托自己是引用类型,所以声明委托的时候不能在要领中声明。可以作为内部类,也可以声明到namaspace下面。

  2.、必需有一个要领包罗了要执行的代码,这个要领要和委托声明的签名一致,包孕参数和返回值

C#一中要为委托找到一个要领的话必需要和委托的签名完全一直,在C#2中允许委托的斜边和逆变。必需下面的委托:

delegate object SayHello(string word);  

这个委托可以被下面这个要领实例化:

static string Sayhello(object word) { Console.WriteLine(word); return word.ToString(); }

3、创建委托自己


可以给与new操纵符来创建一个委托的实例:

SayHello say = new SayHello(Sayhello);

C#2中撑持委托-要领组的转换,所以,可以直接使用

SayHello say = Sayhello;

4、挪用委托

一切筹备就绪后就可以用invoke要领来完成挪用。C#还可以更简单的完成这个操纵,使用

SayHello say = Sayhello; say("hello,you");

就可以完成,不过在背后编译器帮你完成了一些事情:

装箱的背景在于值类型和引用类型的值不同:值类型的值就是值本身

 二、合并和删除委托


委托和string的特征有一些相似:都是不易变的。这表此刻委托的合并和删除上面:

委托内部有一个操纵列表(invocation list):System.Delegate的静态要领Combine和Remove卖力创建新的委托实例。此中,Combine将两个委托的操纵列表链接到一起,Remove卖力将一个委托实例的一个操纵删除。它们都不转变原有的类型(所以说和string很像)他们都是返回一个Delegate。

很少在代码中直接挪用Delegate.Combine,Delegate.Remove而是用+=和-=操纵符。这同样是编译器的功勋:

装箱的背景在于值类型和引用类型的值不同:值类型的值就是值本身

如果挪用列表中抛出异常,那么抛出异常的阿谁要辅导致挪用列表不在执行。

如果有返回值,那么挪用列表会返回最后挪用的阿谁要领的值。所以一般不会在挪用列表中执行有返回值的要领。

但是如果有须要,可以通过挪用invocationlist来逐个执行要领并获取返回值。

三、事件

首先来看事件的声明:

public event SayHello SayHelloEvent;

事件是对委托的封装,有点儿类似于属性和后备字段的关系,上面这句声明编译器会做如下事情:

1、在不异的感化域中声明一个SayHello委托类型的私有字段

2、声明一个类似于属性的块布局,这个块布局包罗一个类似于属性的取值要领和赋值要领,由编译器进行定名,前缀分袂是"add"和"remove"。

3、在外部,会通过+=和-=来操纵事件,声明事件时的访谒修饰符会限制这一操纵。就是说如果声明为一个private的事件的话外部是不能操纵事件的。

4、在内部,+=操纵符会挪用“add”前缀的要领,“add”前缀的要领会挪用Delegate.Combine来合并操纵,同理,-=操纵符会挪用“remove”前缀的要领,该要领会挪用Delegate.Remove来删除操纵。

5、从上面可以看出,事件就是一对儿“add"和”remove“要领。他封装了委托,从而制止挪用方直接操纵委托,而是通过事件来间接的操纵委托,在类的内部可以看到委托,在类外部可以看见事件。

总结一下,事件不是委托实例,只是成对儿呈现的add/remove要领。类似与属性的get/set要领。

类型系统的特征

在C#4之前,C#的类型系统是静态的、显式的和安适的。

一、静态类型和动态类型

C#是静态类型的:每个变量或表达式的类型在编译时都是已知的。只有类型已知的操纵才是被允许的。静态这个词用来暗示使用不乱的类型数据来分析哪些操纵可用。

与静态类型想对应的是动态类型,动态类型的本色是变量中含有值,但那些值不限于特定的类型。所以编译器不能执行不异形式的查抄。

二、显示类型和隐式类型