C#中命名引數和可選引數

cloproad發表於2017-12-20

呼叫方法時,變數名不需要新增到呼叫中。比如有如下的方法用於移動矩形並在移動之後設定他的寬和高:

public void MoveAndResize(int x,int y,int width,int height)
有兩種呼叫方式:
1. MoveAndResize(10,20,30,40); 

2. MoveAndResize(x: 10,y: 20,width: 30,height: 40);

第一種方式是常用的也非常簡單,但是從呼叫上看不出來所用引數的含義。
第二種方式採用了命名引數,也就是:引數名 : value   的形式,這種方式可以直觀的體現初始化什麼引數,還可以更改呼叫順序,比如:

MoveAndResize(y: 20,x: 10,width: 30,height: 40);

但是第二種方式用起來比較繁瑣,實際在編輯器中也有程式碼提示等相關的功能,比如滑鼠放在方法名上,原方法的相關的定義都出現了。
不過命名引數的實際用處在於他和可選引數的結合使用。可選引數:顧名思義,在方法呼叫的時候可以不用給該引數賦值。比如下面的方法有一個引數:isTest,當 isTest 為 true 時,進行某些操作:

public void Test(int a , bool isTest = false)

在呼叫的時候當我不需要與第二個引數相關功能的時候可以不用賦值:

Test(10);

可選引數使用:必須要為該引數設定預設值,而且可選引數必須放在函式引數列表的最後。
命名引數與可選引數的結合使用,比如現在有一個方法:

public void TestM(int a ,int b = 1 , int c = 2, bool d = false , string e = "test")

當我呼叫的時候,如果只想用到其中的 a,d 引數怎麼辦?,可以這樣呼叫
1. 將 d 前面的引數全部初始化,其中可選引數用預設值初始化:

    TestM(2,1,2,true);

2. 使用命名引數:

    TestM(2,d: true);

注意上面的情況,當有多個可選引數時,命名引數的作用凸顯,可以傳遞任何可選引數而不關心到底有幾個可選引數和他們的順序。

相關文章