
.net 类型处理
文章平均质量分 92
JasonJuly
这个作者很懒,什么都没留下…
展开
-
.net 委托和接口的逆变和协变泛型类型实参
委托的每个泛型参数都可标记为协变量或者逆变量。利用这个功能,可将泛型委托类型的一个变量转型为同一个委托类型的另一个变量,后者的泛型参数类型不同。泛型类型参数可以是以下任何一种形式。1,不变量(invariant) 意味着泛型类型参数不能更改。2,逆变量(contravariant)意味着泛型类型参数可以从一个基类型更改为该类的派生类。在C#中,用in关键字标记逆变量形式的泛型类型参数。逆变量泛型类型参数只出现在输入位置,比如作为方法的参数。3,协变量(covariant)意味着泛型类型参数可以从一个派原创 2020-11-20 22:06:49 · 163 阅读 · 0 评论 -
.net 委托的揭秘
从表面看,委托似乎很容易使用:用C#的delegate关键字定义,用熟悉的new操作符构造委托实例,用熟悉的方法调用语法来调用回调函数(只是要用引用了委托对象的一个变量来替代方法名)。然而,实际情况比前面几个例子演示的要复杂一些。编译器和CLR在幕后做了大量工作来隐藏复杂性。首先让我们重新审视下面一行代码:internal delegate void Feeback(Int32 value)看到这行代码后,编译器实际会像下面这样定义一个完整的类:internal class Feeback : S原创 2020-11-17 22:28:18 · 146 阅读 · 0 评论 -
.net 谨慎使用显示接口方法实现
1,没有文档解释一个类型具体如何实现EIMI, 也没有Microsoft Visual studio 智能感知支持。2,值类型的实例在转型为接口时装箱。3,EIMI 不能由派生类型调用。在.net framework 参考文档中查看一个类型的方法时,会列出显示接口方法实现EIMI, 但没有提供类型特有的帮助,只能看到接口方法的常规性帮助。例如int32类型的文档只是说他实现了IConvertible接口的所有方法。能做到这一步当然不错,因为开发人员指导这些方法时存在的。但是,这也让开发人员感到困惑,因原创 2020-11-16 23:04:26 · 129 阅读 · 0 评论 -
.net 继承接口
C# 编译器要求将用于实现一个接口的方法标记为public . CLR要求将接口方法标记为virtual. 如果在源代码中没有显示地将方法标记为virtual, 编译器会将它们标记为virtual和sealed; 这会阻止派生类重写接口方法。如果显式地将方法标记为virtual, 编译器就会将该方法标记为virtual(并保持它的密封状态)。这样一来。派生类就能重写它。如果一个接口方法是sealed的,派生类就不能重写它。不过派生类可以重新继承同一个接口,并可为该接口的方法提供它自己的实现。在一个对象上调原创 2020-11-15 22:56:29 · 518 阅读 · 0 评论 -
.net 泛型的优势
泛型为开发人员提供了以下优势:1,源代码保护,使用一个泛型算法的开发人员不需要访问算法的源代码。然而,使用C++模板的泛型技术时,算法的源代码必须提供给准备使用算法的用户。2,类型安全,将一个泛型算法应用一个具体的类型时,编译器和CLR能理解开发人员的意图,并保证只有与指定数据类型兼容的对象才能随同算法使用。若试图使用不兼容类型的一个对象,会造成编译时错误,或在运行时抛出异常。在上例中,试图将一个String对象传给Add方法,造成了编译器报错。3,更加清晰的代码,由于编译器强制类型安全性,所以减少了原创 2020-11-10 22:20:42 · 307 阅读 · 0 评论 -
.net 设计要公开事件的类型
开发人员要经历多个步骤,才能定义好一个公开了一个或多个事件成员的类型。本节详细描述每一个不要的步骤。MailManager 示例应用程序展示了MailManager类型、Fax类型和Pager类型的所有源代码。注意,Pager类型和Fax类型几乎完全相同。1,第一步:定义类型来容纳所有需要发送给事件通知接收者的附加信息事件引发时,引发事件的对象可能希望向接收事件通知的对象传递一些附加的信息。这些附加的信息需要封装到它自己的类中,该类通常包含一组私有字段,以及一些用于公共这些字段的只读公共属性。根据约定,原创 2020-11-09 22:55:40 · 128 阅读 · 0 评论 -
.net 分部类,结构和接口
本节要讨论分部类、结构和接口。要注意的是,这个功能完全是由C#编译器提供的还有其他一些编译器也提供了这个功能,CLR对于分部类,结构和接口是yiwusuozhi 的。partial这个关键字告诉C#编译器,一个类,结构或者接口的定义源代码可能要分散到一个或者多个源代码文件中。主要有三方面的原因促使我们将某个类型的源代码分散到多个文件中。1,源代码控制 假定一个类型的定义由许多源代码构成,一个程序员把它从源代码控制系统中签出以进行修改。没有其他程序员能同时修改这个类型,除非以后执行一次合并。使用parti原创 2020-11-08 20:48:08 · 186 阅读 · 0 评论 -
.net 对象的相等性和同一性
开发人员经常都要边写代码来比较不同的对象。例如,有时需要将对象放到一个集合中,并编写代码对集合中的对象进行排序、搜索或者比较。本节将讨论相等性和同一性,还将讨论如何定义一个正确实现了对象相等性的类型。System.Object类型提供了一个名为Equals的虚方法,它的作用是在两个对象包含相同的值的前提下返回true . object 的Equals方法是像下面这样实现的:public class Object{ public virtual Boolean Equals(Object obj){原创 2020-11-07 20:13:37 · 174 阅读 · 0 评论 -
.net 值类型的装箱和拆箱
值类型是比引用类型更“轻型”的一种类型,因为它们不作为对象在托管堆中分配,不会被垃圾回收,也不通过指针来引用。但在许多情况下,都需要获取对值类型的一个实力的引用。例如假定要创建一个ArrayList对象(System.Collections命名空间中定义的一个类型)来容纳一组Point结构,那么代码可能像下面这样:struct Point{ public Int32 x,y;}public sealed class Program{ public static void Main(){ Ar原创 2020-11-07 12:10:59 · 198 阅读 · 0 评论 -
.net 引用类型和值类型
CLR支持两种类型:引用类型和值类型。虽然FCL中大多数类型都是引用类型,但程序员用的最多的还是值类型。引用类型总是从托管堆上分配的,C#的new操作符会返回对象的内存地址——也就是指向对象数据的内存地址。使用引用类型时,必须注意到一些性能问题。首先考虑以下事实。1,内存必须从托管堆上分配。2,堆上分配的每个对象都有一些额外的成员,这些成员必须初始化。3,对象中的其他字节(为字段而设)总是设为零。4,从托管堆上分配一个对象时,可能强制执行一次垃圾收集操作。如果所有类型都是引用类型,应用程序的性能将原创 2020-11-06 23:04:05 · 131 阅读 · 0 评论