C#6新特性

C#6新特性

在C#6中有一个新的C#编译器。它完成源码的清理。现在自定义程序也可以使用编译器管道的特性,并使用Visual Studio的许多特性。
这个新的C#编译器平台允许用许多新特性改进C#。虽然这些特性都没有LINQ或async关键字影响大,但许多改进都提高了开发人员的效率。C#6有哪些变化?

0.3.1 静态的using声明

C# 5

using System;

Console.WriteLine("Hello,World!");

C# 6

using static System.Console;

WirteLine("Hello,World!");

0.3.2 表达式体方法

表达式体方法只包括一个可以用lambda语法编写的语句:

C#5

public bool IsSquare(int num)
{
     return num == 0;
}

C#6

public bool IsSquare(int num) => num == 0;

0.3.3 表达式体属性

与表达式体方法类似,只有get存取器的单行属性可以用lambda语法编写:

C#5

public string FullName
{
	get
	{
	 	return FirstName + "  " + LastName;
	}
}

C#6

public string FullName => FirstName + "  " + LastName;

0.3.4 自动实现的属性初始化器

C#5

public class Person
{
	public Person()
	{
		Age = 24;
	}
	public int Age {get; set;}
}

C#6

public class Person
{
	public int Age {get; set;} = 42;
}

0.3.5 只读的自动属性

为了实现只读属性,C#5需要使用完整的属性语法;而在C#6中,可以使用自动实现的属性:

C#5

private readonly int _bookId;
        public int BookId {
            get
            {
                return _bookId;
            }
        }

C#6

 public int BookIdTest { get; }

0.3.6 nameof 运算符

使用新的nameof运算符,可以访问字段名、属性名、方法名或者类型名。这样,在重构时,就不会遗漏名称的改变:

C#5

public void Method(object o)
{
	if (o == null) throw new System.ArgumentNullException("o");
}

C#6

public void MethodTest(object o)
{
	if (o == null) throw new System.ArgumentNullException(nameof(o));
}

0.3.7 空值传播运算符

空值传播运算符简化了空值的检查:

C#5

int? age = p = null ? null : p.Age;

C#6

int? age = p?.Age;

C#5

var handler = Event;
if(handler != null)
{
	handler(source,e)
}

C#6

handler?.Invoke(source,e)

0.3.8 字符串插值

字符串插值删除了对string.Format的调用,它不在字符串中使用编号的格式占位符,占位符可以包含表达式:

C#5

public override ToString()
{
	return string.Format("{0},{1}",Title,Publisher)
}

C#6

public override ToString() => #"{Title}  {Publisher}"

0.3.9 字典初始化器

字典现在可以用字典初始化器来初始化,类似于集合初始化器。

C#5

var dict = new Dictionary<int,string>();
dict.Add(3,"three");
dict.Add(7,"seven");

C#6

var dict = new Dictionary<int,string>()
{
	[3] = "three",
	[7] = "seven"
};

0.3.10 异常过滤器

异常过滤器允许在捕获异常之前过滤它们。

C#5

try
{

}
catch(MyException ex)
{
	if(ex.ErrorCode != 405) throw;
}

C#6

try
{

}
catch(MyException ex) when (ex.ErrorCode == 405)
{

}

新语法的一大优势是,它不仅减少了代码的长度,而且没有改变堆栈跟踪----在C#5中会改变堆栈跟踪。

0.3.11 Catch中的await

C#5

bool hasError = false;
string errorMessage = null;
try
{

}
catch (System.Exception ex)
{
    hasError = true;
    errorMessage = ex.Message;
}
if (hasError)
{
    await new MessageDialog().ShowAsync(errorMessage);
}

C#6

try
{

}
catch (System.Exception ex)
{
	await new MessageDialog().ShowAsync(errorMessage);
}
发布了62 篇原创文章 · 获赞 5 · 访问量 3935

猜你喜欢

转载自blog.csdn.net/qq_42194657/article/details/102917962