14.參數修飾符
(1)ref參數修飾符
C#(和Java相比)可以讓你按引用傳遞參數。描述這一點的最明顯的例子是通用交換方法。不象C++,不但是聲明時,調用時也要加上ref指示符:【譯注:不要誤會這句話,C++中當然是沒有ref關鍵字】
public class Test
{
public static void Main ()
{
int a = 1;
int b = 2;
swap (ref a, ref b);
}
public static void swap (ref int a, ref int b)
{
int temp = a;
a = b;
b = temp;
}
}
(2)out參數修飾符
out關鍵字是對ref參數修飾符的自然補充。Ref修飾符要求參數在傳入方法之前必須被賦值。而out修飾符則明確當方法返回時需顯式給參數賦值,。
(3)params參數修飾符
params修飾符可被加在方法的最後的參數上,方法將接受任意數量的指定類型的參數【譯注:在一個方法聲明中,只允許一個params性質的參數】。例如:
public class Test
{
public static void Main ()
{
Console.WriteLine (add (1, 2, 3, 4).ToString());
}
public static int add (params int[] array)
{
int sum = 0;
foreach (int i in array)
sum += i;
return sum;
}
}
【作者注:學習Java時一個非常令人詫異的事是發現Java不能按引用傳遞參數,盡管不久以後,你很少會再想要這個功能,並且寫代碼時也不需要它了。當我第一次閱讀C#規范的時候,我常想,“他們干嗎把加上這個功能,沒有它我也能寫代碼”。經過反省以後,我意識到這其實並不是說明某些功能是否有用的問題,更多是說明了沒有它你就另需別的條件才能實現的問題。
當考慮到C++是怎麼做的時候,Java是干了件好事,它簡化了參數如何傳遞的問題。在C++中,方法【譯注:C++中沒有方法一說,應該稱為“函數”或“成員函數”】的參數和方法調用通過傳值、引用、指針【譯注:例如int、int*、int&】,使得代碼變得不必要的復雜。C#顯式傳遞引用,不管是方法聲明時還是調用時。它大大地減少了混亂【譯注:這句話應該這麼理解:由於C++的語法問題,有時你並不知道你是在使用一個對象還是一個對象引用,本節後有示例】,並達到了和Java同樣的目標,但是C#的方式更有表達力。顯然這是C#的主旨—它不把程序員圈在一個圈裡,使他們必須繞一個大彎子才能做成某件事。還記得Java嗎?Java指南裡,建議如何解決傳引用的問題,你應該傳遞一個1個元素的數組去保存你的值,或另做一個類以保存這個值。
【譯注:
#include "stdafx.h"
class ParentCls
{
public:
virtual void f(){printf("ParentCls ");}
};
class ChildCls : public ParentCls
{
public:
virtual void f(){printf("ChildCls ");}
};
void Test1(ParentCls pc) {pc.f();}
void Test2(ParentCls& pc) {pc.f();}
int main(int argc, char* argv[])
{
ChildCls cc;
Test1(cc);//輸出ParentCls
Test2(cc);//輸出ChildCls
file://只看調用處,是不知道你使用的引用還是對象的,但運行結果迥異!
return 0;
}
】