声明
本文内容来自微软 MVP solenovex 的视频教程——真会C#吗?-- C#全面教程,大致和第 5 课—— 基础 - 转换、值类型和引用类型、内置类型分类(入门) 对应。
本文主要包括以下内容:
-
转换
-
C# 类型分类
转换
C# 里,互相兼容的类型实例间可以相互转换。
转换总是从现有的值创建出来一个新的值。转换包括隐式 vs. 显式转换。
隐式转换自动发生,隐式转换的两个必要条件:1. 编译器可以保证转换会成功;2. 信息不会有损失。
显式转换需要手动进行,有可能被截断。显式转换的两个条件只要任意一个成立即可。编译器不能保证转换会成功;信息可能会有损失。
如果编译器可以断定转换肯定会失败,那么两种转换都会被禁止。
int x = 12345; // int is a 32-bit integer
long y = x; // Implicit conversion to 64-bit integer
short z = (short)x; // Explicit conversion to 16-bit integer
C# 类型分类
C# 内置类型分为:1. 值类型,2. 引用类型,3. 范围类型参数,4. 指针类型。可以通过内置类型创建自己的自定义类型。
值类型和引用类型的根本区别在于处理内存的方式。
内置类型的分类
-
值类型
- signed integer(sbyte,short,int,long)
- unsigned integer(byte,ushort,uint,ulong)
- 实数(float,double,decimal)
- 逻辑(bool)
- 字符(char)
-
引用类型
- 字符串(string)
- 对象(object)
内置类型在 System 命名空间,除了 decimal 之外的内置类型叫做原始类型,通过指令,在编译的代码里直接被支持,通常被翻译成底层处理器直接的支持;System.IntPtr 和 System.UIntPtr 也是原始类型。
值类型
包含所有的内置类型(数值,字符,bool)和自定义的 struct 和 enum
引用类型包含所有的 class,数组,delegate,interface 类型。
值类型实例的赋值动作总是复制了该实例。值类型变量/常量的内容就是一个值。使用 struct 关键字可以创建自定义的值类型。
值类型的存储的开销,值类型的实例所占的内存 = 它的字段需要内存的总和。CLR 会把类型的字段大小设置为该字段实际大小的整数倍。
public struct Point { public int X, Y; }
引用类型
引用类型的存贮方式分两部分,包含对象和对象的引用。引用类型的常量/变量的内容就是一个含有值的对象的引用。
给引用类型的变量赋值,复制引用而不是对象实例。允许多个变量引用同一个对象。
引用类型的存储的开销,需要为引用和对象单独分配内存;对象所占内存 = 其字段所占内存总和 + 额外的管理开销(最少 8 字节);每个对象的引用还需要额外的 4 或 8 个字节, (根据平台是 32 位或是 64 位)
null
关键字
null
关键字是表示不引用任何对象的空引用的文字值。 null 是引用类型变量的默认值。 普通值类型不能为 null
。 但是,C# 2.0 引入了可以为 null
的值类型。
public class Point { public int X, Y; }
网友评论