zoukankan      html  css  js  c++  java
  • 初识.NET的公共类型系统CTS找工作常被问道的问题


    初识.NET的公共类型系统CTS

    摘要
    著名计算机科学家N.Wirth提出过这样一个公式:算法 + 数据结构 = 程序,他不仅指出了数据结构在计算机科学中的地位,也指出了它与算法的密切联系。算法与数据结构是相辅相成,缺一不可的两个方面。数据结构在微软.NET平台中的形式就是公共类型系统(Common Type System)。

    目录
    1. 公共类型系统简介
    2. 值类型和引用类型
    3. Boxing(装箱)和UnBoxing(拆箱)
    4. 小结

    1.公共类型系统简介
    时至今日,编程语言已经发展的丰富多彩,但是他们几乎都有类似的特点—支持各种数据类型(如整形、字符串形等),代码模块化及面向对象。.NET平台利用了不同语言的这个相近的共性,抽象出公共类型系统CTS(Common Type System)。公共类型系统构成了.NET框架的公共语言运行时的基础,其中最重要的一个体现就是.NET平台的多语言支持,而运行于.NET平台的每一种语言又为了维护自己的语法特色,便使用别名来代替.NET的基础数据类型,如Visual Basic .NET中的Integer类型以及C#中的int类型实际上是基础数据类型System.Int32的化名。
    公共类型系统不仅定义了所有的数据类型,并提供了面向对象的模型以及各种语言需要遵守的标准。CTS可以分为两个大类:值类型和引用类型,同时这两种类型之间还可以进行强制转换,这种转换被称为Boxing(装箱)和UnBoxing(拆箱)。从图表1可以看出公共类型系统的基本结构,CTS的每一种类型都是对象,并继承自一个基类—System.Object。

    图表1. 公共类型系统CTS的体系

    2. 值类型和引用类型
    值类型是继承自ValueType类,值类型的变量直接存储数据,实例是被分配在栈中的,并且永远不可能为空。通过下面的例子可以看出,两个整形变量是分别存储数据的,如下面的代码,无论哪个变化都不会影响另一个。
    [Visual Basic]
    Dim iA As Int16 = 123
    Dim iB As Int16 = iA
    iA = 321
    Console.WriteLine("A = {0}", iA)
    Console.WriteLine("B = {0}", iB)
    [C#]
    Int16 iA = 123;
    Int16 iB = iA;
    iA = 321;
    Console.WriteLine("A = {0}", iA);
    Console.WriteLine("B = {0}", iB);
    
    引用类型是继承自Object,引用类型变量存储的是数据内存的地址,而实例是被分配在可以进行垃圾回收的堆中的。一份数据可以被多个变量引用,使用这种变量类型能够起到节省内存资源的作用,同时也会由于一个引用变量的修改而导致其他引用的变更。引用类型的变量是可以为空的,那表示它不指向任何对象。如下面的代码,可以看出clsA和clsB实际上都指向内存中同一个对象的实例。
    [Visual Basic]
    Imports System
    Module Module1
    Sub Main()
    Dim clsA As New clsRef()
    clsA.iValue = 123
    Dim clsB As clsRef = clsA
    clsB.iValue = 321
    Console.WriteLine("A = {0}", clsA.iValue)
    Console.WriteLine("B = {0}", clsB.iValue)
    Console.Read()
    End Sub
    End Module
    Class clsRef
    Public iValue As Int16
    End Class
    [C#]
    using System;
    class Class1
    {
    static void Main(string[] args)
    {
    clsRef clsA = new clsRef();
    clsA.iValue = 123;
    clsRef clsB = clsA;
    clsB.iValue = 321;
    Console.WriteLine("A = {0}", clsA.iValue);
    Console.WriteLine("B = {0}", clsB.iValue);
    Console.Read();
    }
    }
    class clsRef
    {
    public Int16 iValue;
    }
    

    3. Boxing(装箱)和UnBoxing(拆箱)
    将值类型数据指定给引用类型数据时,系统会先从堆之中配置一块内存,然后将值类型数据复制到这一内存,最后再使引用类型数据指向到这一内存,这样的过程称为Boxing(装箱)。
    [Visual Basic]
    Dim I As Int16 = 123
    Dim objRef As Object = I
    [C#]
    Int16 I = 123;
    object objRef = I;
    
    反之即为UnBoxing(拆箱),而且只有引用类型数据需要拆箱。
    [Visual Basic]
    Dim J As Int16
    J = Int(objRef)
    [C#]
    Int16 J;
    J = (Int16)objRef;
    
    在装箱的过程中,内存的配置是很费时的操作,虽然透明于程序员,考虑到程序的执行效能,我们应该尽量避免不必要的装箱操作。

    4. 小结
    公共类型系统还包括Classes,Delegates,Arrays,Interfaces和Pointers等类型,提供了面向对象、事件及回调函数处理、数组和接口等功能。总之CTS是通向.NET的必经之路,打下良好的基础便能灵活运用.NET中的各种数据类型,做到以不变应万变。

  • 相关阅读:
    八、基本数据结构(图形结构)
    七、基本数据结构(树形结构)
    4、使用 ImportTsv 将 Hive 数据导入 Hbase
    六、跳表
    五、二分法查找
    四、归并排序 && 快速排序
    一、kafka 介绍 && kafka-client
    三、排序之冒泡、插入、选择
    二、YARN
    三、synchronized & lock
  • 原文地址:https://www.cnblogs.com/skyfei/p/354652.html
Copyright © 2011-2022 走看看