今天下午在看C#3.0編碼規範,看到一些自己不明白比較模糊的代碼,特發上來珍藏,這些代碼有時候還是比較有用的.
class @class { public static void @static(bool @bool) { if (@bool) System.Console.WriteLine("true"); else System.Console.WriteLine("false"); } }
@指你如果真的無法避免用C#關鍵字的話那就在關鍵字前面加上@,代碼編譯時間就不會報錯
lock
{
}
unlock
{
}
lock,unlock一般用在多線程中,用於鎖定和解鎖一個程式碼片段,防止兩個線程同時用一段代碼
check
{
}
uncheck
{
}
check,uncheck用於檢查程式碼片段中的資料類型是否超出邊界,check檢查,uncheck不檢查,uncheck超出邊界時不發出異常,自動返回資料類型的最小值mixValue.
yield return C#中的列舉程式
使用C# 2.0 這些問題如同五月末的雪般融化了。在這個例子的2.0版本中,我重寫上面的列表,使用C# 2.0的兩個新特性:泛型 和 列舉程式。
我以重新定義實現IEumerable<string>的ListBox作為開始:
public class ListBox : IEnumerable<string>
這樣做確定這個類可以在foreach迴圈中使用,同時確保迭代的值是string類型。
現在,從上個例子中挪去整個嵌套類,並且用下面的代碼替換 GetEnumerator方法。
public IEnumerator<string> GetEnumerator()
{
foreach (string s in strings)
{
yield return s;
}
}
GetEnumerator方法使用了新的 yield 語句。yield語句返回一個運算式。yield語句僅在迭代塊中出現,並且返回foreach語句所期望的值。那也就是,對GetEnumerator的每次調用都將會產生集合中的下一個字串;所有的狀態管理已經都為你做好了!
就這樣了,你已經完成了。不需要為每個類型實現你自己的enumerator,不需要建立嵌套類。你已經移除了至少30行代碼,並且極大地簡化了你的代碼。程式繼續像期望的那樣運行,但是狀態管理不再是你的任務,所有的都為你做好了。更進一步,由列舉程式所返回的值一定是string類型,如果你想要返回其他類型,你可以修改IEnumerable泛型語句,IEnumerable泛型語句將反射新類型。
關於Yield的更多內容
作為對上面的一些旁註,很值得告訴你,實際上,你可以在yield語句塊中yield一個以上的值。這樣,下面的語句是完全正確的C#語句:
public IEnumerator GetEnumerator()
{
yield return "Who";
yield return " is";
yield return "John Galt?";
}
假設上面的代碼位於一個名為foo的類中,你可以這樣寫:
foreach ( string s in new foo )
{
Console.Write(s);
}
輸出結果將會是:
Who is John Galt?
如果你停下來思考一下,這也是之前的代碼所做的事。它遍曆了自己的foreach迴圈,並且產生出它所找到的每個string字串