[英]C# Operators and readability
我只是在處理一些代碼並發現自己犯了這個錯誤
if (stringName == "firstName" || "lastName")
// Do code
顯然這是錯誤的,應該是
if (stringName == "firstName" || stringName == "lastName")
// Do code
但它只是讓我思考可讀性會更容易嗎? 也許有一些邏輯可以說除非指定一個新的stringName,否則使用第一個?
真的不是一個問題,我只是好奇,如果有一些我不完全理解編譯這樣的聲明背后的邏輯。
我認為你的提議會混淆表達式解析的規則 - 現在,'=='變成了一個quadreny(?)運算符,而不是二進制運算符。 我發現自己錯過了SQL的'IN'運算符,並且使用了類似這樣的東西:
if (stringName.In("foo", "bar", "baz"))
{
}
// in an extension method class
public static bool In<T>(this T value, params T[] values)
{
return values.Contains(value);
}
問題是如果對布爾有效。
stringName == "firstName"
返回一個布爾值。
"lastName"
是一個字符串文字。
||
是一個短路的布爾值或運算符,兩側都有布爾值。
換句話說,您想要更改||
的定義 這通常是一個壞主意。
從理論上講,你可以讓解析器推斷出你的意思......但這很快就會變得含糊不清。
if (stringName == firstName || lastName)
看起來不錯吧? 但究竟什么是lastName?
如果我這樣做怎么辦?
const bool lastName = false;
此外, &&
與||
相反 ,但stringName == firstName && lastName
與上述邏輯不同,實際上沒有意義。
當代碼明顯錯誤以便修復它時編譯器猜測程序員的意圖是一個非常非常糟糕的主意。
即使有括號,也沒有意義。 stringName == ("firstName" || "lastName")
看起來好像要測試兩個字符串的真實性,並且這些字符串總是為真,然后將該布爾結果與字符串stringName
進行比較。
如果你添加這樣的括號(stringName == "firstName") || "lastName"
(stringName == "firstName") || "lastName"
,條件也總是如此,因為無論stringName
是否等於"firstName"
, "lastName"
始終為true。
我喜歡Ruby的做法:
["firstName", "lastName"].include? stringName
您可以像其他人一樣建議使用Contains
或者將String擴展方法寫入您可以執行的操作:
stringName.EqualsOneOf(new[] {"firstName", "lastName"})
他們不允許這種語法的原因很可能是因為可讀性。 如果您是第一次查看代碼,並且您並未完全處於最佳狀態,則可能無法立即看到您將stringName
與"firstName"
和"lastName"
。 它只是讓你的意圖更加明確。
然后,括號可能會解決這個問題。
這只有在operator||(string,string)
返回時才會起作用..一種字符串集合,你有一個Equals
重載,它接受一個字符串和字符串集合,並驗證字符串是否在集合中。 對於很少使用的構造,在幕后做了很多工作。
特別是因為你已經可以做以下事情:
if(new string[]{"firstName","lastName"}.Contains(stringName))
// code
我發現Contains()函數解決了這個問題,即:
string[] ValidNames = new string[] { "firstName", "lastName"};
if(ValidNames.Contains(stringName))
{
//Do Code
}
我不介意SQL語法如下:
if(stringName in ("firsName", "lastName"))
{
}
這就是為什么,作為一種習慣,我總是這樣做:
if ((stringName == "firstName") || (stringName == "lastName"))
// Do code
一段時間后,它成為第二天性。
當FCL包含豐富的內容以創建在此主題中看到的各種各樣的答案時,您不需要具有更靈活的C#語法,因為可讀性很快就會成為您如何在所有豐富內容中創建答案的功能。 它很大程度上歸結為方法和對象調用之間的選擇。
這是一個示例(只是眾多中的另一個),它能夠在一個字符串數組中同時定位一個或多個字符串,或者將您認為合適的任何其他條件應用於該組字符串。 與任何代碼一樣,縮進,間距和代碼注釋對於理解此代碼示例起着重要作用。
bool found = Array.Exists(
// array of strings to search
new[] { "c#", ".net", "programming", "design patterns", "work", "play", "bits", "bytes", "break" },
// criteria - can even satisfy multiple conditions simultaneously if desired
str => (str == ".NET" || str == "work") //look for ".NET" or "work"
);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.