文章出處
在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);
這的確清楚多了,但它確實需要你在設計你的方法簽名時牢記這一點。
不含病毒。www.avast.com |
全站熱搜
留言列表