C#知识整理(1)

c#语言相关:

  • 类型、接口、委托默认是隐式内部的(即internal)。类类型成员默认是隐式私有的(即private)(方法和字段)。接口的成员默认是public的并且不能显示声明

  • 函数修饰符:out,ref,params,默认传递方式按值传递
out与ref的区别和相同点
相同:
out和ref都是按引用传递
区别:
1)作为out传递的实参不需要在它们传递给方法之前初始化;作为ref传递的实参需要在这之前初始化
2)如果被调用的方法没有给out实参赋值会出现编译错误;而ref实参不会编译错误

  • 关键字const和readonly的区别和相同点
相同:
两者都可以作为类字段的修饰符,并且都不允许在类的方法或属性中修改其值。
区别:
1)const编译时确定,readonly运行时确定。
2)作为类或结构的const字段是隐式静态的;而readonly字段不是隐式静态的(这意味着每个对象都有一个),因此,要从类级别公开PI,就必须显式使用static关键字,静态只读字段的赋值必须在静态构造函数中设置初始值(不能在构造函数中赋值)
3)const必须在定义常量时初始化,因为常量是编译时就确定的;而readonly除了可以在定义时初始化,也可以在构造函数中为其赋值,因为只读字段的值是在运行时决定的,除此之外的地方为readonly字段赋值也会导致编译错误。
const针对的值类型只能是原始数据类型(int,char,float,bool),而不能在引用类型中使用;而readonly可以。
4)const除了可以修饰类字段,也可以作为局部变量的修饰符;而readonly不能修饰局部变量

  • 装箱和拆箱
装箱是指将值类型变量隐式转为引用类型变量(但引用类型指向的真实对象仍然是值类型,可参见《.net面向对象揭秘》p181)
拆箱即为装箱的逆操作,将引用类型变量显示转换为值类型变量


  • 隐式类型的局部变量和数组
隐式类型变量最终会产生强类型数据。因此,var关键字与脚本语言(如VBScript)的variant数据类型不一样,对后者来说,一个变量可以在程序的生命周期中保存不同类型的值(也叫做“动态类型化”)
使用关键字var会存在很多限制。隐式类型只能应用于方法或者属性内局部变量的声明
1)不能用var来定义返回值、参数的类型、或类型的数据成员
2)使用var进行声明的局部变量必须在声明时进行赋值,并且不能以null作为初始值
3)不能使用C#的?标示来定义可空隐式类型局部变量


4)定义隐式类型的数组时,在数组初始化式中的各数组成员必须为同一可推断类型(全部为int,string等等)。和我们想象的不一样,隐式类型局部变量不会默认设置为System.Object,因此以下代码会生成编译时错误:
var d=new{1,"one",2,"two",false};(编译错误)

  • 类与结构的区别(具体参见<<CLR via C#>>p108)
类(class)
1. 生成的对象是引用类型。内存必须在托管堆上分配,托管堆上分配的内存需等待垃圾回收器自动回收。
因此分配对象以及访问对象的速度较慢
2. 支持继承,所以可以有多态行为。在面向对象功能上,类的灵活性远高于结构

结构(struct)
1. 值类型。
分配、访问,回收速度都比之引用类型较快
值类型的实例一般在线程栈上分配(虽然也可作为字段嵌入到一个引用类型对象中)。离开方法后系统自动释放
因此分配访问值类型对象的速度较快。并且缓解了托管堆的压力,并减少了一个应用程序在其生存期内需要进行垃圾回收次数
在栈上分配内存,从而访问数据比访问堆上的引用类型快(引用类型必须在堆中通过其引用访问获得数据);
当方法调用完毕后可以快速清理为结构分配的内存,而引用类型必须等待垃圾回收器的自动清理。
复制容易。对象中包含引用类型时复制需要考虑深复制。
2. 继承自System.ValueType,隐含为sealed,不支持继承(所以结构里没有protected成员),不需要多态行为(可以通过接口实现,但考虑到装箱操作会使性能下降)
3. 不能包含用户自定义默认构造函数。C#编译器会提供一个默认构造函数,将结构中的所有字段初始化为默认值。


应用上如果要选择struct类型,需要考虑是否满足一下条件:
类型不需要从任何其他类型继承。类型也不会派生出其他任何类型。
类型的实例字段较小(约为16字节或者更小);或 类型的实例字段较大(大于16字节),但不作为方法的实参传递,也不从方法返回。

在P/Invoke时,大多数情况,非托管DLL方法需要传入结构。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值