扩展自动属性语法
自动属性初始化表达式。
public class Example
{
// 6.0新增语法糖
public string FirstName { get; set; } = "Monkey";
// 6.0之前的写法
//private string _firstName = "Monkey";
//public string FirstName
//{
// get { return _firstName; }
// set { _firstName = value; }
//}
public Example()
{
}
}
自动属性可以不定义 set 访问器。
public class Example
{
public string FirstName { get; } = "Monkey";
public string LastName { get; }
public Example()
{
}
}
只读属性可以在类型构造函数中初始化。
public class Example
{
public string FirstName { get; } = "Monkey";
public string LastName { get; }
public Example(string lastName)
{
LastName = lastName;
}
}
Null 条件运算符
用于在执行成员访问 (?.) 或索引 (?[) 操作之前,测试是否存在 NULL。 可帮助编写更少的代码来处理 null 检查。
成员访问 (?.) :
public static string Truncate(string value, int length)
{
return value?.Substring(0, Math.Min(value.Length, length));
// C# 6.0 之前的写法
//string result = value;
//if (value != null)
//{
// result = value.Substring(0, Math.Min(value.Length, length));
//}
//return result;
}
索引 (?[) 操作:
List<Example> examples = null;
Example example = examples?[0];
// 上述相当于 Example? item = (examples != null) ? examples[0] : null
Console.WriteLine(example == null); // 输出 True
导入静态类 (using static)
允许访问类型的静态成员,而无需限定使用类型名称进行访问:
//静态导入Console
using static System.Console;
using static System.Math;
using static System.DayOfWeek;
class Program
{
static void Main()
{
//直接使用方法而不用Console.WriteLine
WriteLine(Sqrt(3*3 + 4*4));
WriteLine(Friday - Monday);
}
}
字符串格式化
// 字符串格式化可以这样写:
var s1 = $"{p.Name} is {p.Age} year{{s}} old";
var s2 = $"{p.Name,20} is {p.Age:D3} year{{s}} old";
var s3 = $"{p.Name} is {p.Age} year{(p.Age == 1 ? "" : "s")} old";
nameof 表达式
WriteLine(nameof(DayOfWeek.Friday)); // 输出 Friday
static void Main(string[] args)
{
throw new ArgumentNullException(nameof(args), "ArgumentNullException");
}
上面示例代码运行结果:
未经处理的异常: System.ArgumentNullException: ArgumentNullException
参数名: ** args**
字典初始化器
static void Main(string[] args)
{
var strings = new Dictionary<string, string>()
{
["ABC"] = "abc",
["DEF"] = "def"
};
foreach (var s in strings)
{
WriteLine(s.Key + ": " + s.Value);
}
WriteLine();
var numbers = new Dictionary<int, string>
{
[7] = "seven",
[9] = "nine",
[13] = "thirteen"
};
foreach (var n in numbers)
{
WriteLine(n.Key + ": " + n.Value);
}
ReadKey();
}
上面示例代码输出结果为:
ABC: abc
DEF: def
7: seven
9: nine
13: thirteen
异常过滤器
catch (ArgumentNullException e) when (e.ParamName == “…”)
{
}
如果括号表达式(when)的结果为 true 时,才执行对应 catch 块中的语句,否则继续搜索处理程序。
static void Main(string[] args)
{
try
{
throw new ArgumentNullException(nameof(args), "ArgumentNullException");
}
catch (ArgumentNullException ex) when (ex.ParamName == "arges")
{
WriteLine("ArgumentNullException");
}
catch (Exception ex) when (ex.InnerException == null)
{
WriteLine("Exception");
}
}
示例代码输出结果为:
Exception
在 catch 和 finally 块使用关键字 await
C# 6.0 之前catch和finally块中是不能用 await 关键词的。现在我们可以再这两个地方使用await了。
public async void Info()
{
try
{
//Do something
}
catch (Exception)
{
await SumPageSizesAsync();
}
finally
{
await SumPageSizesAsync();
}
}
private async Task SumPageSizesAsync()
{
string url = "http://api.xxxx.com/";
HttpClient client = new HttpClient();
Task<byte[]> getContentsTask = client.GetByteArrayAsync(url);
byte[] urlContents = await getContentsTask;
}