文章出處

在CodeProject上看到一篇有意思的文章,特翻譯和分享下:

 

每當我看到一個方法調用如下:

Enum.TryParse(stringRepresentationOfEnum, true, out enumValue);

我就會想這個’true’ 參數代表的是什么意思呢。在這個例子中,基于我過去的經驗我知道在這個方法中它代表的是ignoreCase 參數。

但是,如果這是一個你從未見過的完全不同的方法呢:

service.DoOperation(DateTime.Now, true, false, false, true, currentValue, userName);
 

這是一個特別XXX的方法。但是假設一下這就是這個方法必須要的簽名,可悲的是,在這個方法想要明白boolean 參數的值的含義很難,

假設我們不能改變接口,我們還能做什么來讓代碼更清楚呢?

 

首先,我們可以為每個boolean值傳遞命名好的變量:

bool includeHeader = true;
bool checkSecurity = false;
bool validateDate = false;
bool fireCompletionEvent = true;
service.DoOperation(DateTime.Now, includeHeader, checkSecurity, validateDate, fireCompletionEvent, currentValue, userName);

 

 

除了代碼有點不簡潔外,這的確好了很多。

當然在C# 4.0 中,我們不需要這樣做,相反我們可以使用命名參數:

service.DoOperation(DateTime.Now, includeHeader: true, checkSecurity: false, validateDate: false, fireCompletionEvent: false, currentValue, userName);

 

 

不幸的是,它并不能如期的正常運行 - 最后面的兩個參數無法出現在命名參數的后面。

這意味著我們必須添加一些額外的代碼:

service.DoOperation(DateTime.Now, includeHeader: true, checkSecurity: false, validateDate: false, fireCompletionEvent: false, currentValue: currentValue, userName: userName);

 

這就是為什么我建議把布爾參數放到參數列表的最后的原因:

service.DoOperation(DateTime.Now, currentValue, userName, includeHeader: true, checkSecurity: false, validateDate: false, fireCompletionEvent: false);

這的確清楚多了,但它確實需要你在設計你的方法簽名時牢記這一點。

 

 

原文鏈接:Put boolean arguments last [Technical Blog]


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 AutoPoster 的頭像
    AutoPoster

    互聯網 - 大數據

    AutoPoster 發表在 痞客邦 留言(0) 人氣()