c#方法參數ref和out區別
params 關鍵字可以指定採用數目可變的參數的 方法參數。
可以發送參數聲明中所指定類型的逗號分隔的參數列表或指定類型的參數數組。 還可以不發送參數。
在方法聲明中的 params 關鍵字之後不允許任何其他參數,並且在方法聲明中只允許一個 params 關鍵字。
class Program
{
staticvoidMain()
{
TestClass.Useparams(1, 'a',"test");//不同類型的數據
Console.ReadKey();
}
}
publicclassTestClass
{
publicstaticvoidUseparams(params object[]list)
{
for(int i = 0; i < list.Length; i++)
{
Console.Write(list[i] + " ");
}
Console.WriteLine();
}
}
ref 關鍵字會導致通過引用傳遞的參數,而不是值。 通過的效果引用指向該參數的任何更改。方法反映在基礎參數變量在被調用的方法上。 引用參數的值與基礎參數變量的值始終是一樣的。
class TestRef
{
static void Test(ref int i)
{
i = i +1;
}
static void Main()
{
int val = 2;
Test (refval);
Console.WriteLine(val);
//輸出3
}
}
out 關鍵字會導致參數通過引用來傳遞。 這與 ref 關鍵字類似,不同之處在於 ref 要求變量必須在傳遞之前進行初始化。 若要使用 out 參數,方法定義和調用方法都必須顯式使用 out 關鍵字。
class TestOut
{
static void Test(out int i)
{
i = 1;
}
static void Main()
{
int value; // int val = 2這是ref的寫法 必須先初始化
Test (out value);
// value is now 1
}
}
以上是根據c#參考文檔整理
下面我自己的理解
Out在此處必須先賦值 而ref不需要
而調用時候應爲out已經有值了所有可以直接用
而ref根本沒有值使用時必須先定義值
(很容易理解的 out就是我會寫代碼你直接叫我寫我就馬上寫
Ref就是 我還不會寫代碼 你叫我寫 那你先教會我寫)
class Program
{
staticvoidMain()
{
inta; //不論a的值爲多少 TestClass.Testout(out a);均輸出3 以函數裏面的定義爲準(類似方法的返回值 方法只能返回一個out可以多個)
//int a=12
int b = 3// TestClass.Testref(ref b)的結果隨b的值改變
TestClass.Testref(ref b);
TestClass.Testout(out a);
Console.ReadKey();
}
}
publicclassTestClass
{
publicstaticvoidTestref(ref inti)
{
i= i + 1;
Console.WriteLine(i);
}
publicstaticvoidTestout(out inti)
{
i= 2;
i= i + 1;
Console.WriteLine(i);
}
}
總結:ref和out這兩個關鍵字的區別是:
1、使用ref型參數時,傳入的參數必須先被初始化。對out而言,必須在方法中對其完成初始化。
2、使用ref和out時,在方法的參數和執行方法時,都要加Ref或Out關鍵字。以滿足匹配。
3、out適合用在需要retrun多個返回值的地方,而ref則用在需要被調用的方法修改調用者的引用的時候。(本來她是30歲,讓她輸出18歲就可以使用ref 實際的30歲是不會改變的)