這是1年多之前我在公司所作講座的講義,如今與園友們分享,歡迎拿去使用、一塊兒討論。文中有若干思考題,對園友們是小菜一碟。另有設計模式講義一篇,隨後發佈。
博文上了首頁,感謝博客園團隊推薦,也感謝全部園友的支持。
經園友提醒,咱們推薦新手使用ReSharper插件,它能夠自動提示不符合代碼規範的地方。
「.NET平臺開發規範」包括兩方面內容:代碼規範、最佳實踐。算法
(1) 規範和優美的代碼風格有助於思路清晰。編程
(2) 規範和優美的代碼有助於團隊溝通交流。設計模式
(3) 規範和優美的代碼有助於學習近20年(後設計模式時代)現代面向對象思想發展的精華。數組
.NET平臺是繼Java平臺以後又一偉大的帶集大成面向對象類庫的虛擬機平臺。.NET平臺及其主力語言C#吸收了Java平臺及Java語言的所有優勢和精華(包括開發規範),並逐漸發展和首創出了鮮明的、先進的特點。併發
衆所周知,C#最初全盤照搬了Java。但時至今日,Java語言準備採用C#中的lambda語法。Java平臺是個優秀的平臺(類庫、虛擬機),但Java語言卻日益得到差評,因而JVM上的其餘語言愈來愈多地取代了Java,如Groovy,Scala,JRuby等。app
.NET平臺上的語言數量比Java平臺有過之而無不及,但與之大相徑庭的是,C#始終在.NET中保持絕對優點地位。C#也許不是.NET上最優秀的語言,但已經足夠優秀來進行生產。而Java語言卻稱不上足夠優秀,由於有語言專門用來彌補它的不足,最典型的就是Scala。而Scala解決的問題,如函數式編程、併發編程,在C#中早有解決方案。框架
絕不誇張地說,.NET是現代面向對象開發思想和實踐的一個制高點,而C#則是編程語言發展趨勢(聲明性、動態性、併發性)的風向標。編程語言
即便你是一名C++開發人員,你也能從中獲益。ide
(4) 規範是微軟內部祕笈,優美是祕笈指導下的修煉。函數式編程
這些規範和最佳實踐多來源於微軟負責CLR、BCL、C#/VB團隊的成員。它們體現了.NET和C#設計人員的智慧結晶。例如,他們會告訴你哪些功能已經被哪些新功能取代而不建議使用,而新功能新方法老是以優雅的方式解決舊功能存在的問題,會給人啓發,很值得回味,使用新功能收穫的不只是方便快捷,還有水平層次的提高。
本教程主要綜合如下資料中的觀點和我公司開發實踐寫成:
正 |
誤 |
if (a == null) { return; } |
if (a == null) return; |
正 |
誤 |
NumberOfArgumentsIn |
nargin |
正 |
誤 |
ParcelName |
strParcelName |
抽象基類 |
-Base |
接口 |
I- |
異常 |
-Exception |
事件參數 |
-EventArgs |
事件委託 |
-EventHandler |
特性 |
-Attribute |
泛型類型參數 |
T- |
[思考題1]
從右邊找出與左邊項目相關的接口。
資源回收 |
|
a |
IFormattable |
Convert.ToString() |
|
b |
IEquatable |
重載關係運算符 |
|
c |
IConvertible |
if (textbox1.Text == "Hello") |
|
d |
IClonable |
Double.ToString() |
|
e |
IDisposible |
foreach循環 |
|
f |
IComparable |
from p in q select p; |
|
g |
IEnumerable |
複製數組元素 |
|
h |
IQueryable |
i, j, k |
循環變量(類型:System.Int32) |
o |
System.Object |
s |
System.String |
e |
事件實參(基類:System.EventArgs) |
ex |
異常(基類:System.Exception) |
g |
System.Drawing.Graphics |
x, y, z |
Lambda表達式的形參 |
1 |
2 |
if (a > 0) { } else // a <= 0 { } |
} // end of foreach |
[思考題2]
string s = "abcdeeg"; s[5] = 'f';
以上代碼在C++和C#中是否都合法?是否都有效?
[思考題3]檢測一個字符串str是否以"abc"開頭,有兩種方法(不使用StartsWith):
str.SubString(0, 3) == "abc"; str.IndexOf("abc") == 0;
請問哪一種方法好,爲何?
CLR中的字符串是不可變類型,字符串分配是一項昂貴的操做。所以咱們有如下最佳作法:
函數式編程爲C#帶來了高可讀性的聲明式語法。循環是一種命令式語法,在聲明式語法中相應的是對集合的mapping操做。
如下代碼生成前100個徹底平方數:
var squares = Enumerable.Range(1, 100).Select(x => x * x);
返回int數組:squares.ToArray();
返回List<int>集合:squares.ToList();
如下代碼對集合foos中每一個元素執行DoSomething()成員方法:
foos.ForEach(x => x.DoSomthing());
如下代碼選出foos中大於100的元素:
var q = foos.Where(x => x > 100);
points中點按到原點距離排序:
var q = points.OrderBy(x => x.DistTo(new Point(0, 0)));
foos中平方最小的數:
double minSq = foos.Min(x => x * x); double min = foos.Distinct().Single(x => x * x == minSq);
foos中的數是否有大於100的(是否都大於100)
foos.Any(x => x > 100); foos.All(x => x > 100);
public class Tuple<T1, T2> { private T1 _item1; private T2 _item2; public T1 Item1 { get { return _item1; } } public T2 Item2 { get { return _item2; } } public Tuple(T1 item1, T2 item2) { _item1 = item1; _item2 = item2; } } public class TupleList<T1, T2> : List<Tuple<T1, T2>> { public void Add(T1 item1, T2 item2) { base.Add(new Tuple<T1, T2>(item1, item2)); } }
Button btn = new Button { Text = "Click me!", BackColor = Color.FromArgb(255, 255, 255) }; btn.Click += (sender, e) => MessageBox.Show("Hello!");
如下代碼編譯成相同IL:
// 1. Example Using clause: using (myConnection = new SqlConnection(connString)) { myConnection.Open(); } // 2. Example Try / Catch block: try { myConnection = new SqlConnection(connString); myConnection.Open(); } finally { myConnection.Dispose(); }
Func<Color, EventHandler> changeControlColor = x => (sender, e) => (sender as Control).BackColor = x; button1.Click += changeControlColor(Colors.Red);