概述:所有代码均来自MVC源码的阅读。实际上,也是框架开发中常用的技巧。
1.使用Empty模式处理空对象
return Enumerable.Empty<ModelValidationResult>();
2.ConcurrentDictionary的GetOrAdd
ConcurrentDictionary<string, string> dic = new ConcurrentDictionary<string, string>(); //如果存在pzdn的键,则直接返回;否则,添加CreateObject(),并返回 var reuslt = dic.GetOrAdd("pzdn", CreateObject());
3.使用Case从Object[]转为IEnumberable<>
对于类型转换,往往进行遍历,而忘记了使用扩展方法。
type.GetCustomAttributes(typeof(AttributeUsageAttribute), true) .Cast<AttributeUsageAttribute>() .First()
4.使用??简化if
??可以简化注释代码
public string Roles { //get //{ // if (_roles == null) return string.Empty; // return _roles; //} get { return _roles ?? String.Empty; } set { _roles = value; _rolesSplit = SplitString(value); } }
5.使用构造函数重载来完成多构造器
其核心为:所有的重载,最终都指向一个具体实现。如下加粗代码:
public HttpStatusCodeResult(int statusCode) : this(statusCode, null) { } public HttpStatusCodeResult(HttpStatusCode statusCode) : this(statusCode, null) { } public HttpStatusCodeResult(HttpStatusCode statusCode, string statusDescription) : this((int)statusCode, statusDescription) { } public HttpStatusCodeResult(int statusCode, string statusDescription) { StatusCode = statusCode; StatusDescription = statusDescription; }
6.使用throw Exception来切除分支
对于指定的方法,是在特定的上下文中,做特定的事情。
而上下文,可能就是通过参数进行传递的,或者访问Member。
当上下文为空,或者不满足条件时,方法的执行就没有意义。所以,在函数的适当位置,进行如下类似的判断:
if (httpContext == null) { throw new ArgumentNullException("httpContext"); }
7.使用TypeDescriptor进行读取特性列表
IEnumerable<AuthorizeAttribute> attributes = TypeDescriptor.GetAttributes(someClass).OfType<AuthorizeAttribute>();
8.使用Linq的let定义中间变量
如果想要知道let关键字的作用,很简单,考虑实现以下同样的功能,如果将 let trimmed = piece.Trim() 去掉,则代码将怎么写?
internal static string[] SplitString(string original) { if (String.IsNullOrEmpty(original)) { return new string[0]; } var split = from piece in original.Split(',') let trimmed = piece.Trim() where !String.IsNullOrEmpty(trimmed) select trimmed; return split.ToArray(); }