C#方法中参数ref和out详解

2019-12-30 18:07:36于丽

一、ref="/kaifa/cjc/46862.html">C#方法中参数类型

有4种参数类型,有时候很难记住它们的不同特征,下图对它们做一个总结,使之更容易比较和对照。

C#,ref,out

二、C#方法中的参数

1、值参数

   使用值参数,通过复制实参的值到形参的方式把数据传递到方法。方法调用时,系统做如下操作:

    · 在栈中为形参分配空间

    · 复制实参到形参

   注:栈(先进后出)是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;

      堆(队列优先,先进先出)是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小。


/// <summary>
/// 声明方法
/// </summary>
/// <param name="value">参数</param>
/// <returns>返回值</returns>
static float FuncData(float value )
{
  float i = 1.5F;
  float j = 2.5F;

  float value1 = FuncData(i);    //方法调用
  float value2 = FuncData(i+j);   //方法调用(一个值参数的实参不一定是变量。它可以是任何能计算成相应数据类型的表达式)
  return value1 + value2;
}

2、引用参数

  · 使用引用参数时,必须在方法的声明和调用中都使用ref修饰符

  · 实参必须是变量,在用作实参前必须被赋值,如果是引用类型变量,可以赋值为一个引用或者null值


/// <summary>
/// 声明方法
/// </summary>
/// <param name="value">参数</param>
/// <returns>返回值</returns>
static void FuncData(float value )
{
  //方法调用                 
  int temp=0;      //实参变量
  FuncData(ref temp);  //包含修饰符ref
  //FuncData(ref temp+1); //错误,必须使用变量
}

/// <summary>
/// 方法声明
/// </summary>
/// <param name="value">参数</param>
/// <returns>返回值</returns>
static int FuncData(ref int value)
{
  return value = 100;
}

3、输出参数

  · 必须在声明和调用中都使用修饰符。输出参数的修饰符是out不是ref

  · 和引用参数相似,实参必须是变量,而不能是其他类型的表达式。(因为方法需要内存位置保存返回值)


/// <summary>
/// 声明方法
/// </summary>
/// <param name="value">参数</param>
/// <returns>返回值</returns>
static void FuncData(float value )
{
  //方法调用                 
  int temp=0;      //实参变量
  FuncData(out temp);  //包含修饰符out
  //FuncData(out temp+1); //错误,必须使用变量
}

/// <summary>
/// 方法声明
/// </summary>
/// <param name="value">参数</param>
/// <returns>返回值</returns>
static int FuncData(out int value)
{
  return value = 100;
}