Web开发之C#:(4)C#基元类型
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声明的变量。