/*ref與out參數的使用*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace conapp_6_out與ref的使用
{
//定義類中兩個方法,分別有ref和out參數時不能OverLoad
class CS0663_Example
{
// Compiler error CS0663: "Cannot define overloaded
// methods that differ only on ref and out".
//public void SampleMethod(out int i) { }
public void SampleMethod(ref int i) { }
}
//如果一個方法採用 ref 或 out 參數,而另一個方法不採用這兩類參數,則可以進行重載,如下所示
class RefOutOverloadExample
{
// 定義兩個方法,第一個沒有out參數,第二個有out參數,這種情況支持方法重載
public void SampleMethod(int i) { }
public void SampleMethod(out int i)
{
//注意事項:利用out參數時在方法中必爲out參數賦值,不然會編譯報錯。
i = 300;
Console.WriteLine("i的值爲:{0}", i);
}
}
class RefOverloadExample
{
// 定義兩個方法,第一個沒有ref參數,第二個有ref參數,這種情況支持方法重載
public void SampleMethod(int i)
{
Console.WriteLine("第一次重載的值爲:{0}!", i);
}
public void SampleMethod(ref int i)
{
//注意事項:利用ref參數時在方法可以不爲ref參數賦值,也可以爲ref參數賦值,修改主調方法的變量值.
//i = 300;
Console.WriteLine("重載i的值爲:{0}", i);
}
}
class Program
{
static void Main(string[] args)
{
//RefOutOverloadExample類方法的調用
RefOutOverloadExample RO = new RefOutOverloadExample();
//重載方法SampleMethod(int i)
RO.SampleMethod(100);
int num = 200;
//重載方法SampleMethod(out int i)
RO.SampleMethod(out num);
Console.WriteLine("i的值爲:{0}!", num);
Console.ReadLine();
//RefOverloadExample類方法的調用
RefOverloadExample R = new RefOverloadExample();
////重載方法SampleMethod(int i)
R.SampleMethod(200);
//重載方法SampleMethod(ref int i)
int numm = 500;
R.SampleMethod(ref numm);
Console.WriteLine("第二次的值爲:{0}!", numm);
Console.ReadLine();
}
}
}
總結:本人認爲,ref與out其實都是表示地址傳遞,與值傳遞有着本質的區別。ref和out參數的根本區別在於,在調用方法中,out參數一定要求對參數重新賦值,而ref則可以不用對參數重新賦值(當然也可以重新賦值),還有就是對於重新賦值ref和out方法的重載,當類中定義兩個方法中,有一個有out參數,另一個有ref的參數,則不能執行方法重載,但如果只有一個out或是ref時,則可以執行重載。以上是本人的一點認識,希望大家指正。