C#中类型和C/C++的差异
参考书籍《C#图解教程》
参考文档 Microsoft API 和参考目录
学习C#时候发现和C++类型差别还是不小的,这里就写一下差别。
预定义类型
《C#图解教程》P26
单看数值类型也是有不少区别的
C/C++数据类型,点这里
下面讲讲和C/C++不一样的东西
简单类型
非数值类型
- bool,只有这个类型可以直接作为判断值了,就是说类似 0,1,-1这些数值类型都不具备布尔意义了。
- char,是Unicode字符类型,直接赋值65,0x41等是编译不过的,除非强制转换如:char a = (char)65;
数值类型
- decimal,与浮点型相比,decimal 类型具有更高的精度和更小的范围,这使它适合于财务和货币计算。详见这里decimal(C# 参考)
- sbyte,就是C/C++的 char/signed char 类型。
- byte,就是C/C++的 unsigned char 类型。
所有预定义的简单类型都可以使用Parse静态方法将字符串解析成调用类的类型。
- 非简单类型
- object,C#中所有类都继承至object,包括简单类型。
- string,在C++中,这个是标准库的东西需要导入string头文件。在C#中数组是不可以改变的,即便他有成员方法可以“改变”,那其实都是重新分配了一个新的字符串。要用动态的字符串,那就使用StringBuilder类。
- dynamic,动态,就是可以赋给任何类型,随时变化。
参考查阅:dynamic(C# 参考)
在大多数情况下,dynamic 类型与 object 类型的行为是一样的。 但是,不会用编译器对包含 dynamic 类型表达式的操作进行解析或类型检查。 编译器将有关该操作信息打包在一起,并且该信息以后用于计算运行时操作。 在此过程中,类型 dynamic 的变量会编译到类型 object 的变量中。 因此,类型 dynamic 只在编译时存在,在运行时则不存在。
用户定义类型
这里先不详细讲。 共6种可以由用户自己创建的类型: 1. 类类型(class) 2. 结构类型(struct) 3. 数组类型(array) 4. 枚举类型(enum) 5. 委托类型(delegate) 6. 接口类型(interface)值类型和引用类型
类型又分两种:值类型和引用类型,值类型存放在栈里,引用类型放在堆里,引用类型的成员(包括值类型)也是在堆里,堆里的数据在不再访问时由CLR的GC(垃圾收集器,[详见上一篇](http://blog.csdn.net/l773575310/article/details/71079564) )自动清理掉。**引用类型做参数时, 可以在函数内修改引用变量内部的值,但修改不了引用类型参数指向的对象。除非添加ref修饰符在参数前面。**《C#图解教程》P32
可空类型
可空类型可以创建一个**值类型**变量并标记有效无效,(**注意不能从引用类型或其他可空类型创建可空类型**)- 两个重要只读属性
- HasValue,bool类型,判断是否有效(不为null)。
- Value,和声明的变量一样类型,有效时,返回变量的值。
空接合运算符
int? myI = null;
Console.WriteLine("myI : {0}",myI ?? 666); //当myI为空时,将666赋值给myI。不为空时保持原值。
//等价于: myI == null ? 666 : myI;
可空类型的问号语法其实是种快捷语法,如下两句完全等价。
Null<MyStruct> mSNull = new Nullable<MyStruct>();
//上下两句等价
MyStruct? mSNull = new MyStruct();
*ps:预定义简单类型(int、short、long、等等),实际上在.NET中都实现为结构