这是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);