经过简化的Property
public string MyName { get; set; }
public string MyName { get; protected internal set; }
Func是一个.Net内置的委托。
Func<Result>,Func<T1,Result>是一个.Net内置的泛型委托。
Func<TResult>
Func<T,TResult>
Func<T1,T2,TResult>
Func<T1,T2,T3,TResult>
Func<T1,T2,T3,T4,TResult>
Action<T>的用法与Func几乎一样,调用方法也类似。
Action
Action<T>
Action<T1,T2>
Action<T1,T2,T3>
Action<T1,T2,T3,T4>
两者区别
Func与Action作用几乎一样。只是Func<Result>有返回类型;Action<T>只有参数类型,不能传返回类型。
所以Action<T>的委托函数都是没有返回值的。
问号的演变
string a = null;var b = a??””;
var abc = new Abc{
ID=1,
Name="yukaizhao"
};
public static class StringExtensions
{
/// <summary>
/// 判断字符串是否为null或""
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static bool IsNullOrEmpty(this string str)
{
return string.IsNullOrEmpty(str);
}
}
var a = new {
ID = 1,Name=”yukaizhao”,BlogUrl=”http://www.cnblogs.com/yukaizhao/”
};
//匿名类在linq to sql或者entity framework中返回查询数据时很好用。
字符串嵌入值
var result = $"a{obj}bbbb";
nameof
是C#6新增的一个关键字运算符,主要作用是方便获取类型、成员和变量的简单字符串名称(非完全限定名),意义在于避免我们在代码中写下固定的一些字符串,这些固定的字符串在后续维护代码时是一个很繁琐的事情。
Person p = new Person();
Console.WriteLine(nameof(p));
Console.WriteLine(nameof(p.Name));
Console.WriteLine(nameof(Person.CreateDateTime));
自动属性默认初始化
public string Name { get; set; } = "hello world";
异常过滤器when
使用方法:
try
{
throw new ArgumentException("string error");
}
catch (ArgumentException e) when (myfilter(e))
{
Console.WriteLine(e.Message);
}
static bool myfilter(ArgumentException e)
{
return false;
}
When语法作用是:在进入到catch之前、验证when括号里myfilter方法返回的bool,如果返回true继续运行,false不走catch直接抛出异常。
使用这个filter可以更好的判断一个错误是继续处理还是重新抛出去。按照以前的做法,在catch块内如需再次抛出去,需要重新throw出去,这时的错误源是捕捉后在抛的,而不是原先的,有了when语法就可以直接定位到错误源。
catch和finally代码块内的Await
自从C# 5.0时代引入async和await关键字后,异步编程就变得流行起来。尤其在现在的.NET Core时代,如果你的代码中没有出现async或者await关键字,都会让人感觉到很奇怪。