C# 新技巧(一)

概述:所有代码均来自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();
}
原文地址:https://www.cnblogs.com/pengzhen/p/3801335.html