c# value、ref、out

一、参数传递

  • 方式一:By value      将实参复制一份给形参,函数内对形参进行操作,对形参(复制值)的操作对实参无影响。
  • 方式二:By reference    传递实参内存地址,函数内对地址所在内存进行操作,对形参(引用值)的操作会改变实参。
  • 方式三:By Output         out参数不会在函数内被调用。它将函数内部的参数传递出来,而不是将形参传入函数进行调用。在需要几个返回值时,它会很有用。
static void GetValues(out int x, out int y)
{
  x = 5;
  y = 42;
}
static void Main(string[] args)
{
  int a, b;
  GetValues(out a, out b);
  //Now a equals 5, b equals 42
}

 

static void Ask(out string name)
{   
  name = Console.ReadLine();
}
static void Main(string[] args)
{
  string nm;
  Ask(out nm);
}

 二、value及reference存储形式

  • value类型

  内置类型,如int和double,其值被存储与栈内。

  栈存储value类型和static变量和方法。

  • ref类型

  reference类型用于存储对象(objects)。当实例化一个对象时,对象按引用类型存储:对象数据存储于堆内,此对象所在堆地址存储在栈内。

  

  • 小结  
  • 当我们把一个value类型的值作为参数传递时,在函数内操作的是value类型值的副本。因此形参的改变不会对实参产生影响(除非加上关键字ref,传递引用)。
  • 当我们把reference类型的值作为参数传递时,在函数内对参数的操作通过指针(如图中p1)直接改变了内存。因此形参的改变直接对形参产生了影响。
  • static对象和方法属于当前类,而不是一个特定的(new出来的)实例。

 

  内容总结自 https://www.sololearn.com/Play/CSharp#

posted on 2018-01-15 10:34  workhardplayhard  阅读(236)  评论(0编辑  收藏  举报

导航