知识大全 ASP.NET教程:Ref和Out关键字异同

Posted 类型

篇首语:壮心未与年俱老,死去犹能作鬼雄。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 ASP.NET教程:Ref和Out关键字异同相关的知识,希望对你有一定的参考价值。

ASP.NET教程:Ref和Out关键字异同  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  类型介绍

  在几乎所有的OOP语言中 都存在 种类型的值

    值类型 引用类型

  以C#为例 其值类型为sbyte byte char short ushort int uint long和ulong float和double 当然还有decimal和bool 而引用类型则是string和object

  我想说的

  我想说的就是——Ref和Out把我弄糊涂的原因是 当时没有认真的去分析它对不同类型所做出的不同的动作

  对于值类型

  使用了Ref和Out的效果就几乎和C中使用了指针变量一样 它能够让你直接对原数进行操作 而不是对那个原数的Copy进行操作 举个小例子

  using System;namespace ConsoleApplication      /// <summary>      /// Class 的摘要说明      /// </summary> class Class        /// <summary>      /// 应用程序的主入口点       /// </summary>  [STAThread]  static void Main(string[] args)         int a = ;       int b;       squareRef(ref a);       squareOut(out b);       Console WriteLine( The a in the Main is: + a);       Console WriteLine( The b in the Main is: + b);    static void squareRef(ref int x)         x = x * x;       Console WriteLine( The x in the squareRef is: + x);    static void squareOut(out int y)         y = ;       y = y * y;       Console WriteLine( The y in the squareOut is: + y);   

  显示的结果就是——

  这样的话 就达到了和C中的指针变量一样的作用

  对于引用类型

  对于引用类型就比较难理解了

  先要了解到这一层——就是当一个方法接收到一个引用类型的变量的时候 它将获得这个引用(Reference)的一个Copy 由于Ref关键字可以用来向方法传递引用 所以 如果这个功能被误用了——比如 当一个如数组类型的引用对象用关键字Ref传递的时候 被调用的方法实际上已经控制了传递过来的引用本身 这样将使得被调用方法能用不同的对象甚至NULL来代替调用者的原始引用!

  

  如图 内存地址为 的变量arrayA中其实存放着数组 ……的内存起始地址 如果一个方法fun()使用fun( arrayA[] )的话 它将顺利的获得数据 但这个 将放在一个Copy中 不会放到内存的 位置 而这个时候我们如果使用fun( ref arrayA[] )的话 我们得到的值就是 啦(也就是说 被调用方法能够修改掉arrayA中的那个引用 使之不再指向 甚至可以用NULL来代替 这样的话 那个 地址中的数据可能就要被垃圾回收机制清理了 )

  有个例子

  using System;using System Drawing;using System Collections;using System ComponentModel;using System Windows Forms;using System Data;

  namespace RefOut /// <summary> /// Form 的摘要说明  /// </summary> public class Form : System Windows Forms Form   private System Windows Forms Button button ;  private System Windows Forms Label label ;  /// <summary>  /// 必需的设计器变量   /// </summary>  private System ComponentModel Container ponents = null;

  public Form ()     //   // Windows 窗体设计器支持所必需的   //   InitializeComponent();

  //   // TODO: 在 InitializeComponent 调用后添加任何构造函数代码   //  

  /// <summary>  /// 清理所有正在使用的资源   /// </summary>  protected override void Dispose( bool disposing )     if( disposing )       if (ponents != null)          ponents Dispose();          base Dispose( disposing );  

  #region Windows 窗体设计器生成的代码  /// <summary>  /// 设计器支持所需的方法 不要使用代码编辑器修改  /// 此方法的内容   /// </summary>  private void InitializeComponent()     this button = new System Windows Forms Button();   this label = new System Windows Forms Label();   this SuspendLayout();   //    // button    //    this button Dock = System Windows Forms DockStyle Top;   this button Location = new System Drawing Point( );   this button Name = button ;   this button Size = new System Drawing Size( );

  ; this button TabIndex = ;   this button Text = 显示输出 ;   this button Click += new System EventHandler(this button _Click);   //    // label    //    this label Location = new System Drawing Point( );   this label Name = label ;   this label Size = new System Drawing Size( );   this label TabIndex = ;   this label Text = label ;   //    // Form    //    this AutoScaleBaseSize = new System Drawing Size( );   this ClientSize = new System Drawing Size( );   this Controls Add(this label );   this Controls Add(this button );   this MaximizeBox = false;   this MinimizeBox = false;   this Name = Form ;   this Text = Ref & Out ;   this ResumeLayout(false);

    #endregion

  /// <summary>  /// 应用程序的主入口点   /// </summary>  [STAThread]  static void Main()      Application Run(new Form ());  

  private void button _Click(object sender System EventArgs e)     int[] firstArray = ;   int[] firstArrayCopy = firstArray;

  this label Text = Test Passing firstArray reference by value ;   this label Text += \\n\\nContents of firstArray before calling FirstDouble:\\n\\t ;      for(int i = ;i < firstArray Length; i++)       this label Text += firstArray[i] + ;   

  FirstDouble(firstArray);

  this label Text += \\n\\nContents of firstArray after calling FirstDouble \\n\\t ;

  for(int i= ;i<firstArray Length;i++)       this label Text += firstArray[i] + ;   

  if(firstArray == firstArrayCopy)    this label Text += \\n\\nThe references refer to the same array \\n ;   else    this label Text += \\n\\nThe reference refer to different arrays \\n ;

  int[] secondArray = ;   int[] secondArrayCopy = secondArray;      this label Text += \\nTest passing secondArray reference by reference ;   this label Text += \\n\\nContents of secondArray before calling SecondDouble:\\n\\t ;

  for(int i= ;i<secondArray Length; i++)       this label Text += secondArray[i] + ;   

  SecondDouble(ref secondArray);   this label Text += \\n\\nContents of secondArray after calling SecondDouble:\\n\\t ;      for(int i= ; i<secondArray Length;i++)       this label Text += secondArray[i] + ;   

  if(secondArray== secondArrayCopy)    this label Text += \\n\\nThe reference refer to the same array ;   else    this label Text += \\n\\nThe reference refer to different arrays ;

  this label Text += \\n___________________heshi_________________\\nsecondarray\\n ;

  for(int i = ;i<secondArray Length;i++)       this label Text += secondArray[i] + ;      this label Text += \\nsecondarraycopy\\n ;   for(int i= ;i<secondArrayCopy Length;i++)       this label Text += secondArrayCopy[i] + ;   

  

  void FirstDouble(int[] array)     for(int i = ;i<array Length;i++)    array[i] *= ;   array = new int[] ;  

  void SecondDouble(ref int[] array)     for(int i= ;i<array Length;i++)       array[i] *= ;

     array = new int[] ;   运行后的结果是

  这个就说明了被调用的程序已经改变了原有的Reference

  

  总结

    使用Ref型参数时 传入的参数必须先被初始化 而Out则不需要 对Out而言 就必须在方法中对其完成初始化 使用Ref和Out时都必须注意 在方法的参数和执行方法时 都要加Ref或Out关键字 以满足匹配 Out更适合用在需要Return多个返回值的地方 而Ref则用在需要被调用的方法修改调用者的引用的时候
cha138/Article/program/net/201311/13408

相关参考

知识大全 c#学习体会:使用 ref 和 out 传递数组

  c#学习体会:使用ref和out传递数组(downmoon)希望与大家分享与所有的out参数一样在使用数组类型的out参数前必须先为其赋值即必须由接受方为其赋值例如public stat

知识大全 全面分析C#方法中的ref和out

全面分析C#方法中的ref和out  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  ref&nbs

知识大全 c#中通过值和引用传递参数

  在C#中既可以通过值也可以通过引用传递参数通过引用传递参数允许函数成员(方法属性索引器运算符和构造函数)更改参数的值并保持该更改若要通过引用传递参数请使用ref或out关键字为简单起见本主题的示例

知识大全 nginx 504 Gateway Time-out错误解决办法

nginx504GatewayTime-out错误解决办法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一

知识大全 Out Of Memory的分析及诊断方法

OutOfMemory的分析及诊断方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  首先什么是

量平滑异同移动平均线的计算

量平滑异同移动平均线的计算计算方法:先计算成交量的短期(SHORT)和长期(LONG)指数平滑移动平均线,再推算DIFF和异同平均数(DEA)及两者之差,最后得出VMACD。具体计算公式:SHORT=

知识大全 求助求助 Failed to connect to server Connection timed out

求助求助FailedtoconnecttoserverConnectiontimedout  以下文字资料是由(本站网www.cha138.com)小编为大家搜集整理后发

生物膜法和活性污泥法有哪些异同之处?

34、生物膜法和活性污泥法有哪些异同之处?生物膜法和活性污泥法是以生化处理的不同反应器形式,从外观上看主要区别在于前者的微生物不需要填料载体,生物污泥是悬浮的,而后者的微生物是固定在填料上的,然而它们

生物膜法和活性污泥法有哪些异同之处?

34、生物膜法和活性污泥法有哪些异同之处?生物膜法和活性污泥法是以生化处理的不同反应器形式,从外观上看主要区别在于前者的微生物不需要填料载体,生物污泥是悬浮的,而后者的微生物是固定在填料上的,然而它们

生物膜法和活性污泥法有哪些异同之处?

34、生物膜法和活性污泥法有哪些异同之处?生物膜法和活性污泥法是以生化处理的不同反应器形式,从外观上看主要区别在于前者的微生物不需要填料载体,生物污泥是悬浮的,而后者的微生物是固定在填料上的,然而它们