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数组的值。

posted on 2017-01-16 15:36  DevinSuMi  阅读(151)  评论(0编辑  收藏  举报