本文总结C#一些常见的技术问题,每一个都是简短的解释,篇幅不大,不断更新中… const与radonlyradonly为运行时常量,const为编译时常量。编译时常量比运行时常量快,性能好,但是缺乏灵活性(编译时常量需要重新编译应用程序)。编译时常量(const)仅限于数值和字符串(基元类型),C#不允许使用nw来初始化一个编译时常量const修饰的常量默认是静态的(类型)。radonly修饰的字段可以在构造函数中被修改。使用const较之使用radonly的唯一好处就是性能。 partial关键字此关键字允许将类、结构或接口的定义拆分到多个文件中。如果类的定义,其内容很多,那么分别放在不同的文件中就是一个不错的选择。在Fil1.cs中 namspacAiqir{partialclassA{intnum=0;voidMthodA(){}partialvoidMthodC();}} 在Fil2.cs中 namspacAiqir{partialclassA{voidMthodB(){}partialvoidMthodC(){}}} sald关键字当对一个类应用sald修饰符时,此修饰符会阻止其他类从该类继承。类似于Java中final关键字。 nw和ovrridOvrrid关键字主要是提供派生类对基类方法的新实现,重写的基类方法必须和Ovrrid的方法具有相同的签名。Nw关键字主要用来区别派生类和基类同名方法的选择问题,通过隐藏基类方法,达到使编译器调用正确的方法的目的。也就是说Nw关键字在作为修饰符用于向基类成员隐藏继承成员时,对于派生类该关键字指示方法是重写的新方法,但是关闭了多态性。具体调用的方法为声明时变量的方法。 C#中using语句怎么用?说道using的话,首先要说的就是.Nt中的两种资源,也就是托管资源和非托管资源。托管资源:由CLR管理分配和释放的资源,即从CLR里nw出来的对象。非托管资源:不受CLR管理的对象,如Windows内核对象,文件,数据库连接,套接字,COM对象。这里要注意,假如说你的类型需要显式释放资源,那么一定要继承IDispos接口。而这个IDispos接口就是为using语法糖提供便利,那种在finall处调用Dispos函数的try-catch-finally语句块,其实和using语句生成的IL代码基本上完全一致。 c#类型转换 值类型值类型的类型转换,可以理解为用一个类型A的值去初始化一个类型B的变量。 变宽转换如果是变宽转换,那么不会有问题。比如32位的int到64位的int,或者是int到float。 变窄转换如果是变窄转换,那么就可能有问题。(可能会发生溢出)首先,变窄转换是需要强制类型转换的,不能像隐式转换那样,需要在括号中写入要转换的类型。 doublfoo=3.5;floatbar=(float)foo; 溢出比如short可以存储0~的数字,而byt可以存储的最大值是,那么你将一个为7的short转换为byt类型,那么不会有什么问题。但是如果你将一个大于的short强制类型转换为byt,那就会有问题。 bytdstinationVar;shortsourcVar=;dstinationVar=(byt)sourcVar;//sourcVarval:/dstinationVar:25 原因是这样的(源数据的最左边一位丢失了): ==000011001= 这个数值的例子摘自《c#经典入门》可以使用chckd和unchckd关键字检验溢出。 chckd(xprssion)unchckd(xprssion) 默认就是unchckd的,不写这个关键字也行。如果是chckd,而且发生了溢出,就会抛出异常。 引用类型引用类型的转换与值类型“看上去有点相反”。首先要明确的是引用类型转换的是栈中的变量,而该变量指向的位于堆中的对象不受影响。 向上转换将父类的引用指向子类对象是没什么问题的(多态的本质) 向下转换与值类型的转换类似,引用类型的向下转换也会用到强制类型转换。而这种转换并不总是有效(即便是基类到派生类的转换),转换是否成功,只有在运行的时候才会知道。 Childchild=(Child)fathr; 最常见的用法是传递objct对象,然后在将这个得到的对象转化为要处理的类型,(非泛型集合,发送消息机制) as运算符强制类型转换出现错误会抛出异常,使用as或is会更加优雅。as运算符用于在两个引用类型之间转换,转换失败后会返回一个null,并不会抛出异常。 ClassAa=nwClassA();ClassBb=aasClassB;if(b!=null){......} 无论是as还是is运算符,都比直接使用强制类型转换要安全,而且不需要使用异常检查,只需要判断结果是否为空就可以了。 类型无关的类型转换之前提到的引用类型转换,是指相关类型之间的转换,比如继承关系,共享接口。不相关的两个类型,也可以发生类型转换,这就要使用到重载运算符,你需要自己定义内部转换的原理。需要使用到的重载运算符有:implicit(隐式类型转换)xplicit(显示类型转换) //定义ConvClassA到ConvClassB的隐式转换publicclassConvClassA{publicstaticimplicitopratorConvClassB(ConvClassAop){......}}//定义ConvClassB到ConvClassA的显式转换publicclassConvClassB{publicstaticxplicitopratorConvClassA(ConvClassBop){......}} 原文出处:liuaiqi的博客 原文链接:北京那家医院看白癜风最好北京那家医院看白癜风最好
|