最近在寫程序時遇到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;
}
}
}