C#常识篇(二)

2025-12-13 0 936

委托事件的区别

委托可以认为是对指定签名的函数引用,通过委托可以实现将函数作为参数传递或者间接调用函数,委托是类型安全的,仅指向与其声明时指定签名相匹配的函数。委托可以分为单播委托和多播委托,二者的区别在于是对单个方法还是一组方法的引用,多播委托则可以通过特定的符号\”+=\”和\”-=\”来完成函数的订阅和取消订阅。

事件则是一种特殊的多播委托,其相比于普通的多播委托更加安全,事件将多播委托的调用权限隔离在其所在类的内部,并对外部关闭了直接通过赋值符号\”=\”修改多播委托实例的入口,使得外部调用者仅能够进行基本的函数订阅和取消订阅的操作。

多播委托的底层实现

多播委托实际上是一个类实例,其中定义了一个函数引用列表用于存储订阅的函数。当调用多播委托时,将由CLR来遍历该函数引用列表,并按照订阅顺序依次调用函数。

重载和重写的区别

重载是一种编译时多态,重载函数的名称相同但参数列表不同,在调用时编译器会自动根据传递的参数列表适配指定形式的重载函数。

重写是一种运行时多态,子类重写父类的方法,在调用时根据实例对象的类型而适配重写函数。

for和foreach的区别

以数组为例,for循环根据数组下标遍历元素,而foreach循环通过生成数组的临时迭代器来遍历元素,并且foreach循环是只读的,修改操作可能导致迭代器失效,例如一边遍历一边删除元素的行为。所以通常来说优先考虑使用for循环。

类和结构体的区别

1.类的实例对象保存在堆上,而其引用保存在栈上;结构体的数据和存储其的变量均保存在栈上。

2.类能够实现继承、多态和封装,能够实现接口;结构体仅能实现接口。

3.类为引用类型,可以有多个变量指向同一个类的实例,其中一个变量对实例的修改就会影响其它变量;结构体为值类型,多个变量指向结构体的实例,实际上是各自存储了结构体的副本,所以各自的修改互不影响。

4.类更适合大型对象、需要封装较多行为或者需要实现继承和多态的情况;结构体则适用于轻量的或具有少量行为的或不可变的数据结构,结构体更偏向于数据而不是行为,这与类有所不同。

foreach的原理

foreach是一种结合迭代器模式遍历实现了IEnumerable(或IEnumerable<T>)接口的容器类的语句,这两个接口会提供获取IEnumerator(或IEnumerator<T>)类型迭代器的方法,foreach会在运行时自动获取迭代器并启动对容器类的遍历。

协变和逆变

协变则是将派生程度更大的赋值给派生程度更小的变量,逆变则是将派生程度更小的赋值给派生程度更大的变量。协变和逆变通常针对数组、委托和泛型参数,例如通过out或in关键字修饰泛型参数,使得方法组具有协变或逆变性,协变性通常体现在方法的返回类型,而逆变性通常体现在方法的参数类型。

结构体

结构体隐式继承自System.ValueType,属于值类型,所以其数据和引用它的变量均存储在栈上。以下是结构体的一些特性:

1.无法实现多态和继承,但是可以实现接口,可以重写Equals、ToString、GetHashCode三个方法;

2.无法声明本结构体类型的字段或属性;

3.如果不存在属性且未自定义构造函数,可以不通过new关键字创建结构体实例,但是在使用该结构体实例前须对所有字段进行初始化;

4.自定义的构造函数将覆盖默认的无参构造函数,所以须通过new关键字创建结构体实例,自定义的构造函数须对所有字段进行初始化;

结构体偏向于数据而不是行为,通过变量将结构体实例赋值给其它变量时会涉及到结构体的拷贝,对结构体的拷贝会涉及更多的性能开销。结构体的进阶使用可以参考readonly和init关键字相关知识。

常见修饰符

(1)public:能够在其声明所在的类或结构体甚至程序集外部访问,程序集外部访问需要引用其所在程序集;

(2)protected:能够在直接或间接派生类或其声明所在的类中访问;

(3)private:仅能够在其声明所在的类或结构体中访问;

(4)internal:能够在其声明所在的类或结构体之外但在所处程序集之内访问;

C#常识篇(二)

值得注意的是,未明确指定访问修饰符的类或结构体或接口默认为internal,未明确指定访问修饰符的类成员或结构体成员默认为private,接口成员默认为public。

C#常识篇(二)

静态构造函数

静态构造函数用于初始化任何静态数据,或执行仅需执行一次的特定操作。 将在创建第一个实例或引用任何静态成员之前自动调用静态构造函数。 静态构造函数最多调用一次。如果静态字段的初始化并不复杂或者不涉及一些特殊的处理,那么建议在静态字段声明时即进行初始化,使用静态构造函数会影响运行时优化。常见的应用场景包括日志记录、创建非托管代码的包装类以及运行时的参数类型检查。

如果这篇文章对你有帮助,请给作者点个赞吧!

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 编程相关 C#常识篇(二) https://www.zuozi.net/36591.html

C#常识篇(三)
上一篇: C#常识篇(三)
C#常识篇(一)
下一篇: C#常识篇(一)
常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务