C#中的基元类型

2016-02-19 12:25 19 1 收藏

下面是个简单易学的C#中的基元类型教程,图老师小编详细图解介绍包你轻松学会,喜欢的朋友赶紧get起来吧!

【 tulaoshi.com - 编程语言 】

这篇文章我想复习下C#中的基元类型。虽然搞清楚基元类型的知识并不会是你工作的必要条件,但做为一个搞技术的人来说还是非常有必要的。起码可以对付有些显得比较BT的面试题,哈哈!
   
    关于什么是基元类型,我想并不是每一位开发者都清楚的,有部分的朋友只知道怎么在工作中应用它(例如int,string)。如果一个编程基础比较扎实的朋友来说当然不在话下,就不说别人,拿我自己来说,编程三年多,我都不太关心什么是基元类型,它有什么用,其实不知道这些对工作也不会产生决定性的影响。如果你不知道基类型的概念,但会用int,float之类,对平常工作是没有太大影响的。但如果有人和你讨论这些东西时,还是觉的非常有必要对其进行了解和学习。
    
     比较常见的问题,其中一个也是最近园友说过的:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)


     第一:int和int32有啥区别?
     第二:string和String又有啥区别?
    
     像很多园友回复的一样,对这些东西有时不必要太过较真,但既然有这样的问题,总规要有答案了。这里我列出以下几种申明一个整形变量的代码:
            

          //最简单
            int a = 0;
            //较简洁的
            Int32 b=0;
            //不简洁的
            int c = new int();
            //最不简洁
            System.Int32 d = new System.Int32();

   

      我们再来看下这些代码生成的IL代码:

 .method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // 代码大小       10 (0xa)
  .maxstack  1
  .locals init ([0] int32 a,
           [1] int32 b,
           [2] int32 c,
           [3] int32 d)
  IL_0000:  nop
  IL_0001:  ldc.i4.0
  IL_0002:  stloc.0
  IL_0003:  ldc.i4.0
  IL_0004:  stloc.1
  IL_0005:  ldc.i4.0
  IL_0006:  stloc.2
  IL_0007:  ldc.i4.0
  IL_0008:  stloc.3
  IL_0009:  ret
} // end of method Program::Main
   

    

       结论:它们都是申明一个int32类型的变量,并且对其进行了初始化。至于这是什么原因呢?这里就只能用基元类型来解释了。我们来看下C#的基元类型和FCL以及CLS的部分关系。从下面的表中可以看出:

C# Primitive TypFCL TypeCLS-Compliant sbyteSystem.SBteNO byteSystem.ByteYES shortSystem.Int16YES ushortSystem.UInt16NO intSystem.Int32YES uintSystem.UInt32NO longSystem.Int64YES ulongSystem.UInt64NO charSystem.CharYES floatSystem.SingleYES doubleSystem.DoubleYES decimalSystem.DecimalYES objectSystem.ObjectYES stringSystem.StrignYES


     
           1:int被映射到FCL中的System.Int32中。这里足以解释上面四种创建变量的结果为什么是一样的原因。
           2:string和System.Sting其实并无实质的区别,说的简单点,string是String的一个别名。


     using方式理解基元类型和FCL的关系 : 可以利用using语句来实现:
     

     using sbyte=System.SBYTE;
     using int=System.Int32;
     using string=System.String;

     
     FCL类型之间的转换:我们知道在FCL类型变量之间可以进行相关的转换,例如:
     

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)     Int32 i=0;
     Int64 j=i;//隐式转换成Int64

    

      下面是对应的IL代码:我们可以看出有一人conv.i8操作,这里就是数据类型的转换。

 .method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // 代码大小       7 (0x7)
  .maxstack  1
  .locals init ([0] int32 i,
           [1] int64 j)
  IL_0000:  nop
  IL_0001:  ldc.i4.0
  IL_0002:  stloc.0
  IL_0003:  ldloc.0
  IL_0004:  conv.i8
  IL_0005:  stloc.1
  IL_0006:  ret
} // end of method Program::Main

    

      分析:从OO的角度来讲,这种转换并不是"太正常":
               1:Int32和Int64是两种不同的数据类型;
               2:两者之间并不存在继承关系。
      问题:为什么两者之间能够正常转换呢?也是因为基元类型和的关系。


      类型之间的转换提供了两种方式:
      第一:隐式转换,如果两个类型之间是类型安全的,则可以直接进行转换;
      第二:显示转换,类型之间是非安全的,需要强制转换。

来源:http://www.tulaoshi.com/n/20160219/1600867.html

延伸阅读
C#语言一个最令人感兴趣的地方就是类的索引器(indexer)。简单说来,所谓索引器就是一类特殊的属性,通过它们你就可以像引用数组一样引用自己的类。显然,这一功能在创建集合类的场合特别有用,而在其他某些情况下,比如处理大型文件或者抽象某些有限资源等,能让类具有类似数组的行为当然也是非常有用的。本文就会引领你设置类来采用索引...
介绍 这是C/C++程序迷们经常谈论的一个话题,同时也是一个复杂的、难以理解的话题-指针!每次谈到C#,大多数我遇到的人都持这样的观点-C#中没有指针的概念。而实际上,它已经被废除了,取而代之的是C#中的非安全编程-如何在程序中使用指针。不同于其字面意思的是,使用指针编程并没有什么不安全的。 它如此受关注的根本原因是...
委托 和 事件 在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触 C# 时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里憋得慌,混身不自在。本文中,我将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、...
.都是“虚的”不能被实例化,这也是接口中为什么不能包含字段--成员变量的原因。 2.正因为接口是虚的,所以接口内的索引,属性,时间等只能有声明,而不能在接口内实现,具体如何实现是派生接口或者派生类的事。 3.都具有模板的性质,如果一个接口或者类从某一个接口继承,它将自动具有被集成者的特征(包括索引,属性,函数,实践等)。 4....
上一篇就结构的性能、局限性以及它和类的比较作了简单的描述,这篇我将接着介绍在使用结构时应该注意和把握的原则: 通过上篇的介绍,我们可以很自然的意识到结构在效率上的优越性(相对于类),这主要归因于它们在底层的值类型结构。 不过,它们的对于大容量数据和复杂度高的算法进行处理时所表现出来的局限性,使得它的适用范围大受限制。...

经验教程

361

收藏

55
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部