c#:CTS类型系统

 更新时间:2012年12月03日 16:53:06   作者:  
CTS通用类型系统,是.Net中一套定义类型的规则。我们要掌握c#开发,首先要建立这个类型概念,只有知道c#的元素是什么类型,才能进行相关的分析和选材。

一、值类型和引用类型

C#分两个大类,一类是引用类型;另一类是值类型。

引用类型从技术上来讲,就是一个指针,指向具体的数据;而值类型实际就存放数据。因此引用类型大小都是固定的(虽然它实际关联其他部分,但是你传递引用类型不需要传递这些,只需要传递指针),而值类型有不同的大小。

所有类型都从System.Object派生,包括值类型分支。所有值类型都是System.ValueType的子类,或者是枚举System.Enum的子类。而System.ValueType 和System.Enum自身却是引用类型。因此继承关系和是否是值类型无关,用户需要通过class ,struct等关键字去定义不同的类型。

用户自定义的类、接口、数组、委托是引用类型;自定义的枚举、结构是值类型。

结构和类的区别是,结构的基类型不能自定义,固定是System.ValueType,也就是结构设计上,不能建立多层的继承模式。不过结构可以实现接口。

值类型转换到引用类型时,如转化成基类型Object会产生“装箱”操作,从技术上讲,就是将数据复制到新的内存空间,然后用指针指向它,因此是一个耗费资源的操作。对应的”取消装箱”是个相反的过程。

二、特殊类型

泛型不是一种类型,而是一种定义类型的快捷方式。先用占位符作为类型定义的一部分,在实际定义类型的时候给出对应的部分,形成真实的类型。如class C<T>{} 的C并不是类型,而是未完成的模版,需要给定T 的实际类型,才能得到完整的类型 如: C<int> 这里就定义了一个C<int>类型。泛型可以用来定义引用类型也可以用来定义值类型。

匿名类型是用new {成员a;成员b;} 格式定义的类型,直接继承自Object,成员具有只读性。该类型主要用来处理临时的数据对象。

可null类型,在值类型后增加?表示可null类型。可null类型是System.Nullable<T>泛型结构的实例。主要用在数据库编程。

三、委托类型和接口类型

委托类型从System.Delegate 或 System.MulticastDelegate 派生,属于引用类型。委托类型通过关键字delegate创建,委托类型特殊性在于它主要是用来封装函数的,而结构和类用来封装数据和操作,其中结构偏向数据,而类偏向操作。可见这三种自定义类型,有各自的重点。

委托相当于函数指针,它自身不保存实际的运算过程,而是保持指向函数的指针。这有点类似引用类型的数据关系。可以用函数名初始化委托,也可以创建“匿名方法”或lambda算式实例化委托。

匿名方法通过 delegate{ 语句} 创建,是一种在函数内创建的闭包。所谓闭包是一段代码,但是可以包含宿主函数的局部变量。

lambda 是匿名方法的改进,如 (x,y)=>x+y 可以简洁的描述简单算法。

委托类型和接口类型的共同点是不涉及具体的实现,而关注“形态”,因此都可以做到分离具体实现的目的。其中接口比委托要强大的地方是接口可以定义多个函数形态,而委托只是一个,不过这可能是优势也可能是劣势,比如你可以定义多个委托,链接不同的实例;而用接口的多个函数形态却只能一个实例去实现。

因此,要联通组件,有两个选择:一、对于选择不同算法实现,或者事件通知,用委托最好;二、对于一组关联的操作,对象互操作,用接口最好。

相关文章

  • C#调用Python的URL接口的示例

    C#调用Python的URL接口的示例

    这篇文章主要介绍了C#调用Python的URL接口的示例,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下
    2020-10-10
  • C#中委托的基础入门与实现方法

    C#中委托的基础入门与实现方法

    这篇文章主要给大家介绍了关于C#中委托的基础入门与实现方法的相关资料,究竟什么是委托,用最通俗易懂的话来讲,你就可以把委托看成是用来执行方法(函数)的一个东西,需要的朋友可以参考下
    2021-08-08
  • 详解c# AutoMapper 使用方式

    详解c# AutoMapper 使用方式

    本篇文章主要介绍了详解c# AutoMapper 使用方式 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • C# WPF利用Clip属性实现截屏框功能

    C# WPF利用Clip属性实现截屏框功能

    这篇文章主要为大家详细介绍了C# WPF如何利用Clip属性实现截屏框功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • Quartz.Net任务和触发器实现方法详解

    Quartz.Net任务和触发器实现方法详解

    这篇文章主要介绍了Quartz.Net任务和触发器实现方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • C#基础入门之值类型和引用类型的区别详析

    C#基础入门之值类型和引用类型的区别详析

    在C#中值类型的变量直接存储数据,而引用类型的变量持有的是数据的引用,数据存储在数据堆中,下面这篇文章主要给大家介绍了关于C#基础入门之值类型和引用类型区别的相关资料,需要的朋友可以参考下
    2021-09-09
  • WinForm实现页面按钮定时隐藏功能

    WinForm实现页面按钮定时隐藏功能

    这篇文章主要介绍了WinForm实现页面按钮定时隐藏功能,结合实例形式分析了WinForm基于定时器的页面控件属性动态操作相关实现技巧,需要的朋友可以参考下
    2017-05-05
  • C#实现让窗体获得焦点的方法示例

    C#实现让窗体获得焦点的方法示例

    这篇文章主要介绍了C#实现让窗体获得焦点的方法,涉及C#窗体事件相关操作技巧,需要的朋友可以参考下
    2017-06-06
  • C# Request.Form用法案例详解

    C# Request.Form用法案例详解

    这篇文章主要介绍了C# Request.Form用法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • C# 如何使用ajax请求

    C# 如何使用ajax请求

    这篇文章主要介绍了C# 如何使用ajax请求,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07

最新评论