Web开发之C#:(4)C#基元类型

作者:陆金龙    发表时间:2016-07-21 00:08   


1.C#基元类型

直接映射到FCL中存在的类型,生成的IL代码与使用FCL类型时生成的IL代码完全一致,C#编译器直接支持的数据类型。

C#基元类型中有一部分是与CLS相容的,其他语言也提供对应的基元类型。

2.C#基元类型清单

CLS相容部分

(1)整型

byte System.Byte 无符号的8位整数,数值范围从0~255

short System.Int16 有符号16位整数,数值范围-32768 ~ 32767

int System.Int32 有符号32位整数,数值范围-2147483648 ~ 2147483648

long System.Int64 有符号64位整数-9223372036854775808 ~ 9223372036854775808

char System.Char 代表无符号的16位整数,数值范围从0~65535。 Char类型的可能值对应于统一字符编码标准(Unicode)的字符集

(2)浮点型

float System.Single 值的范围大约可以从1.5*10^ -45~3.4* 10 ^38,精确到小数点后面7位。在数值后加f表示,如:float x=123.456f

double System.Double 值的范围大约可以从5.0*10^ -324~1.7* 10^ 308,精确到小数点后面15位或16位。

(3)小数类型

decimal System.Decimal 数值范围从-7.9*10 ^ -28~7.9* 10 ^ 28,精确到小数点后面28~29位。小数类型非常适用于金融和货币运算。

在数值后加m表示,如:decimal z=1.23m;

 

从float、double到decimal精读依次提高。

整形到decimal的转换才是扩大转换,decimal的精度比double大,但所能储存的最大数却比double要小。

所有的浮点型变量都存在精度损失的问题,decimal是一个不折不扣的浮点型,也存在精度损失!

(4)布尔型

bool System.Boolean

(5)引用类型

string System.String 一个字符数组

object System.Object 所有类型的基类型

dynamic System.Object C#编译器允许使用一个简单的语法,让dynamic参与动态调用

CLS不相容部分

sbyte System.SByte 有符号8位整数,数值范围-128~ 127

ushort System.UInt16 无符号16位整数,数值范围0 ~ 65536

uint System.UInt32 无符号32位整数,数值范围0 ~ 4294967295

ulong System.UInt64 无符号64位整数,0 ~ 18446744073709551615

3.C#基元类型的转换

int i=5;

long l =i;

System.Int32和System.Int64是不同数据类型,且不存在派生关系。之所以能够转换是使用了基元类型的隐式转换。

在安全的时候,C#才允许隐式转换。如从long转向int是不安全的,因此不能隐式转换,必须强制转换。

long l=10;

int i=(int)l;

 

4.C#基元类型详解

4.1 dynamic

为方便使用反射与基本组件通信,C#编译器允许将一个表达式的类型标记为dynamic,还可将一个表达式的结果放到一个变量中,并将变量的类型标记为dynamic。如:

dynamic arg =demo==0?(dynamic)5:(dynamic)”A”;//此处使用与object类似:

dynamic result=Plus(arg);

private static dynamic Plus(dynamic arg)

{

return arg arg; //根据传入参数的实例类型不同,自动采用有不同的运算规则

}

(1)与object比较

使用dynamic做为参数和返回值类型时,代码执行时会根据传入值和返回值推断出相应的类型,并自动转换。object不会。例如上述Plus方法,传入5则返回10,传入”A”则返回”AA”。

任何表达式都能隐式转型为dynamic,编译器还允许dynamic隐式转为其他类型,但不允许从object隐式转为其他类型。如:

dynamic d=111;

int number = d;

(2)与var比较

var表示隐式类型,用var声明一个变量只是一种简便语法,编译器根据一个表达式推断出具体的数据类型。

var声明的变量根据表达式的推断出类型后,类型不可更改,即不可再使用另外的不兼容的类型的值给变量赋值。

var关键字只可用于局部变量。

 

dynamic关键字可用于局部变量、字段、参数、返回值。

表达式不能转型为var,但能转型为dynamic。

必须显示初始化var声明的变量,无需初始化dynamic声明的变量。