C#中大多数类型都是引用类型,只有个别特殊情况是值类型。
值类型:
- 枚举(enum)
- 结构(struct)
- 基础类型:int, short, char, bool....(string是引用类型)
引用类型:
- 数组(即使储存的是值类型的元素,仍然是引用类型)
- 委托类型
- 接口类型
- 类类型
值类型和引用类型各有各自的特点。
值类型:
- 不需要垃圾回收(装箱除外)。
- 不需要类型标识,所以比引用类型占据更小的空间。
- 数据创建在栈上,但也有可能创建在堆上(比如作为类的字段)
- 可以转化为引用类型-----装箱
引用类型:
- 在传递参数,返回值,赋值,拷贝及类似操作时只需要拷贝4-8字节,而不是全部的数据
- 数据创建在堆上
- 默认以值传递的方式进行传递,引用类型的值还是引用
- 可以转化为值类型-----拆箱
如下代码却无法实现改变传入的参数的值的作用:
public static void ST(string sss) { sss = sss.Insert(1, "324"); }
传入参数“hello”,打印出来仍然是“hello”,不是期望的“h324ello”.
而如下代码能够实现改变传入参数的作用:
public static void ST(ref string sss) { sss = sss.Insert(1, "324"); }
原因就是ref使参数传进去了本身的地址,而没有ref则传进去了本身的值。
另一段神奇的代码:
public static void ST(int[] sss) { sss[0] = 10; } public static void ST(ref int[] sss) { sss[0] = 10; }
这两段代码都改变了sss数组的值。