VS2015使用C#6.0中的那些新特性

1、自动属性的增强

1.1、自动属性初始化 (Initializers for auto-properties)

C#4.0下的果断实现不了的。
这里写图片描述


这里写图片描述
只要接触过C#的肯定都会喜欢这种方式。真是简洁方便呀。

1.2、只读属性初始化Getter-only auto-properties

先来看一下我们之前使用的方式吧

public class Customer
{
    public string Name { get; }

    public Customer(string firstName,string lastName)
    {
        Name = firstName +" "+ lastName;
    }
}

再来看一下C#6.0中

public class Customer
    {
        public string FirstName { get; }="aehyok";
        public string LastName { get; }="Kris";

    }

和第一条自动属性初始化使用方式一致。

2、Expression bodied function members

2.1 用Lambda作为函数体Expression bodies on method-like members

public Point Move(int dx, int dy) => new Point(x + dx, y + dy);  

再来举一个简单的例子:一个没有返回值的函数

public void Print() => Console.WriteLine(FirstName + " " + LastName);

2.2、Lambda表达式用作属性Expression bodies on property-like function members

public override string ToString()
        {
            return FirstName + " " + LastName;
        }

现在C#6中

public class User
{
    public string FirstName { get; set; }

    public string LastName { get; set; }

    public override string ToString() => string.Format("{0}——{1}", FirstName, LastName);

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

3、引用静态类Using Static

在Using中可以指定一个静态类,然后可以在随后的代码中直接使用静态的成员
这里写图片描述

4、空值判断Null-conditional operators

直接来看代码和运行结果
这里写图片描述
通过结果可以发现返回的都为null,再也不像以前那样繁琐的判断null勒

5、字符串嵌入值

在字符串中嵌入值

之前一直使用的方式是
这里写图片描述
现在我们可以简单的通过如下的方式进行拼接
这里写图片描述

6、nameof表达式nameof expressions

在方法参数检查时,你可能经常看到这样的代码(之前用的少,这次也算学到了)

public static void AddCustomer(Customer customer)
{
    if (customer == null)
    {
        throw new ArgumentNullException("customer");
    }
}

里面有那个customer是我们手写的字符串,在给customer改名时,很容易把下面的那个字符串忘掉,C#6.0 nameof帮我们解决了这个问题,看看新写法

public static void AddCustomer(Customer customer)
{
    if (customer == null)
    {
        throw new ArgumentNullException(nameof(customer));
    }
}

7、带索引的对象初始化器Index initializers

直接通过索引进行对象的初始化,原来真的可以实现
这里写图片描述
通过这种方式可以发现字典中只有三个元素,所以也就只有这三个索引可以访问额,其他类型的对象和集合也是可以通过这种方式进行初始化的,在此就不进行一一列举了。

8、异常过滤器 (Exception filters)

先来看一个移植过来的方法

try
{
    var numbers = new Dictionary<int, string> {[7] = "seven",[9] = "nine",[13] = "thirteen" };
}
catch (ArgumentNullException e)
{
    if (e.ParamName == "customer")
    {
        Console.WriteLine("customer can not be null");
    }
}

在微软的文档中还给出了另一种用法,这个异常会在日志记录失败时抛给上一层调用者

private static bool Log(Exception e)
{
    ///处理一些日志
    return false;
} 

static void Main(string[] args)
{

    try
    {
        ///
    }
    catch (Exception e){if (!Log(e))
        {

        }
    }

    Console.ReadLine();
}

9、catch和finally 中的 await —— Await in catch and finally blocks

在C#5.0中,await关键字是不能出现在catch和finnaly块中的。而在6.0中

try
{
    res = await Resource.OpenAsync(…); // You could do this. … 
}
catch (ResourceException e)
{
    await Resource.LogAsync(res, e); // Now you can do this … 
} finally
{
    if (res != null)
        await res.CloseAsync(); // … and this. 
}

10、无参数的结构体构造函数—— Parameterless constructors in structs

这里写图片描述


C# 6.0 新特性汇总

1. 静态using(static using)

静态using声明允许不使用类名直接调用静态方法

//The static using declaration allows invoking static methods without the class name.
//In C# 5
using System;
Console.WriteLine("Hello, World!");
//In C# 6
using static System.Console;
WriteLine("Hello, World");

2. 表达式方法(Expression-Bodied Methods)

使用表达式方法,只有一条语句的方法可以使用lambda语法写。

//With expression-bodied methods, a method that includes just one statement can be written with the lambda syntax.
//In C# 5
public bool IsSquare(Rectangle rect)
{
return rect.Height == rect.Width;
}
//In C# 6
public bool IsSquare(Rectangle rect) => rect.Height == rect.Width;

3. 表达式属性(Expression-Bodied Properties)

跟表达式方法类似,只有一个get访问器的单行属性可以使用lambda语法写。

//Similar to expression-bodied methods, one-line properties with only a get accessor can be written with the lambda syntax
//In C# 5
public string FullName
{
get
{
return FirstName +"" + LastName;
}
}
//In C# 6
public string FullName => FirstName +"" + LastName;

4. 自动属性初始化器(Auto-Implemented Property Intializers)

自动属性可以使用属性初始化器初始化。

//Auto-implemented properties can be initialized with a property initializer.

//In C# 5
public class Person
{
public Person()
{
Age = 24;
}
public int Age {get; set;}
}
//In C# 6
public class Person
{
public int Age {get; set;} = 42;
}

5. 只读自动属性(Read-Only Auto Properties)

C# 5需要完整的属性语法实现只读属性,C# 6可以使用自动属性实现。

//To implement read-only properties, C# 5 requires the full property syntax. With C# 6, you can do this using auto-implemented properties.
//In C# 5
private readonly int _bookId;
public BookId
{
get
{
return _bookId;
}
}
//In C# 6
public BookId {get;}

6. nameof操作符(nameof Operator)

字段、属性、方法和类型的name可以通过nameof访问。使用nameof,可以方便的重构name变化。

//With the new nameof operator, names of fields, properties, methods, or types can be accessed. With this, name changes are not missed with refactoring.

//In C# 5
public void Method(object o)
{
if (o == null) throw new ArgumentNullException("o");
//In C# 6
public void Method(object o)
{
if (o == null) throw new ArgumentNullException(nameof(o));

7. Null传递操作符(Null Propagation Operator)

Null传递操作符简化了空值检查。

//The null propagation operator simplifies null checks.
//In C# 5
int? age = p == null ? null : p.Age;
var handler = Event;
if (handler != null)
{
handler(source, e);
}
//In C# 6
int? age = p?.Age;
handler?.Invoke(source, e);

8. 字符串插值(String Interpolation)

字符串差值移除了对string.Format的调用,使用表达式占位符取代数字格式占位符。

//The string interpolation removes calls to string.Format. Instead of using numbered format placeholders in the string, the placeholders can include expressions.
//In C# 5
public override ToString()
{
return string.Format("{0}, {1}", Title, Publisher);
}
//In C# 6
public override ToString() => $"{Title} {Publisher}";

9. 字典初始化器(Dictionary Initializers)

字典可以使用类似集合的字典初始化器初始化。

//Dictionaries can now be initialized with a dictionary initializer—similar to the collection initializer.
//In C# 5
var dict = new Dictionary<int, string>();
dict.Add(3,"three");
dict.Add(7,"seven");
//In C# 6
var dict = new Dictionary<int, string>()
{
[3] ="three",
[7] ="seven"
};

10. 异常过滤器(Exception Filters)

异常过滤器允许你在捕获异常前进行过滤。

//Exception filters allow you to filter exceptions before catching them.
//In C# 5
try
{
//etc.
} catch (MyException ex)
{
if (ex.ErrorCode != 405) throw;
// etc.
}
//In C# 6
try
{
//etc.
} catch (MyException ex) when (ex.ErrorCode == 405)
{
// etc.
}

11. 在Catch使用Await(Await in Catch)

await可以在catch块中直接使用,C# 5中需要变通使用。

//await can now be used in the catch clause. C# 5 required a workaround.
//In C# 5
bool hasError = false;
string errorMessage = null;
try
{
//etc.
} catch (MyException ex)
{
hasError = true;
errorMessage = ex.Message;
} 
if (hasError)
{
await new MessageDialog().ShowAsync(errorMessage);
}
//In C# 6
try
{
//etc.
} catch (MyException ex)
{
await new MessageDialog().ShowAsync(ex.Message);
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值