C# 入门(2) C#类型与C/C++的差异

来源:互联网 发布:怎么用python做计算 编辑:程序博客网 时间:2024/05/06 14:53

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) )自动清理掉。  

《C#图解教程》P32
值类型和引用类型

  **引用类型做参数时, 可以在函数内修改引用变量内部的值,但修改不了引用类型参数指向的对象。除非添加ref修饰符在参数前面。**

可空类型

  可空类型可以创建一个**值类型**变量并标记有效无效,(**注意不能从引用类型或其他可空类型创建可空类型**)
  • 两个重要只读属性
    • 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中都实现为结构

0 0
原创粉丝点击