c#关键字,ref和out

    最近在写程序时遇到ref,out 参数问题。回头有自习看了看MSDN,才有巩固了基础。我把我的测试程序贴出来,大家分享一下。
    ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。传递到 ref 参数的参数必须最先初始化。这与 out 不同,后者的参数在传递之前不需要显式初始化。这是out与ref的却别所在。
     有点像,c++中的函数传递引用,和传递值。比较经典的程序是交换两个数。这里不在贴出代码。

代码
using System;
using System.Collections.Generic;

public class MyClass
{
 
public static void Main()
 {
 
  
/// 通过测试发现,基类型的参数,在没有用ref 的声明后,其值并没有改变,说明此函数中传递的是值。
  
/// 但是,当使用ref 参数是发现,其值发生了变化,说明在此函数中传递的是引用。
  int x=100;
  ChangeTheNumber(
ref x);
  Console.WriteLine(x.ToString());
  
  
  
///通过测试发现,类的实例作为,参数,即使不用ref 参数,它的属性也发生了变化。那是因为,类的的实例,是一个引用。所以不用再使用ref了。
  
/// 这让我想到了,几个月前的项目开发,在不同窗体之间传递参数,但是一直想着做个什么共有方法,然后互相调用。但是,其实很简单,
  
/// 在构造函数中传入需要传入的类的实例就可以了,因为传递的是引用。其属性都会变化。不用再用什么麻烦的方法了。
  
///TestTheClass
     TestClass classInstance1=new TestClass("firstname");
  ChangeTheNumber(classInstance1);
  Console.WriteLine(classInstance1.Name);
  
  TestClass classInstance2
=new TestClass("second");
  ChangeTheNumber(classInstance2);
  Console.WriteLine(classInstance2.Name);
  Console.Read();
 }
 
 
#region Helper methods

 
private static void WL(object text, params object[] args)
 {
  Console.WriteLine(text.ToString(), args); 
 }
 
 
private static void RL()
 {
  Console.ReadLine(); 
 }
 
 
private static void Break() 
 {
  System.Diagnostics.Debugger.Break();
 }

    
private static void ChangeTheNumber(ref int number)
 {
  number
=100;
 }
 
 
private static void ChangeTheNumber(int x)
 {
  x
=100;
 }
 
 
private static void ChangeTheNumber(TestClass classInstance)
 {
  classInstance.Name
="change to another name";
 }
 
 
private static void ChangeTheNumber(ref TestClass classInstance)
 {
  classInstance.Name
="change to another name";
 }
 
#endregion
}

///
///测试类
///
public class TestClass
{
 
public TestClass(string name)
 {
  
this.name=name;
 }
 
 
private string name;
 
public string Name
 {
  
get
  {
   
return name;
  }
  
set
  {
   name
=value;
  }
 }
}

原文地址:https://www.cnblogs.com/csharponworking/p/1616625.html