概述:所有代码均来自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[];
} var split = from piece in original.Split(',')
let trimmed = piece.Trim()
where !String.IsNullOrEmpty(trimmed)
select trimmed;
return split.ToArray();
}