一钟头学会C# 6

九、 Index 初阶化器

本条至关重假若用在Dictionary上,至于有哪些用,我当下没觉得到有几许用处,什么人能精晓很好的利用情形,欢迎补充:

var names = new Dictionary<int, string>
        {
            [1] = "Jack",
            [2] = "Alex",
            [3] = "Eric",
            [4] = "Jo"
        };

        foreach (var item in names)
        {
            Console.WriteLine($"{item.Key} = {item.Value}");
        }

十、using 静态类的办法可以行使 static using

其一意义在我看来,同样是很没有用的作用,也为去掉前缀有的时候咱们不亮堂那些是根源哪个地方的,而且要是有一个同名方法不知晓具体用哪些,当然经求证是运用类本身的覆盖,不过简单搞混不是吗?

using System;
using static System.Math;
namespace CSharp6NewFeatures
 {
  class Program
  {
      static void Main(string[] args)
    {
        Console.WriteLine(Log10(5)+PI);
    }
  }
}

七、只读自动属性

C# 1里大家得以这么已毕只读属性

public class Person
{
    private int age=100;

    public int Age
    {
        get { return age; }
    }
}

唯独当咱们有机动属性时,大家不能实施只读属性,因为电动属性不辅助readonly关键字,所以大家只可以减少访问权限

public class Person
{
    public  int Age { get; private set; }

}

但是 C#6里大家可以完结readonly的活动属性了

public class Person
{
    public int Age { get; } = 100;
}

八、格外过滤器 Exception Filter

   static void Main(string[] args)
    {

        try
        {
            throw  new ArgumentException("Age");
        }
        catch (ArgumentException argumentException) when( argumentException.Message.Equals("Name"))
        {
            throw  new ArgumentException("Name Exception");

        }

        catch (ArgumentException argumentException) when( argumentException.Message.Equals("Age"))
        {
            throw new Exception("not handle");

        }
        catch  (Exception e)
        {

            throw;
        }
    }

在前头,一种极度只好被Catch几回,现在有了Filter后可以对相同的不得了举办过滤,至于有如何用,那就是例外了,我觉得上边的事例,定义七个实际的很是NameArgumentException 和AgeArgumentException代码更易读。

六、自动属性起先化器

从前大家须要赋伊始化值,一般需求这么

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

    public Person()
    {
        Age = 100;
    }
}

但是C# 6的新特征里大家这么赋值

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

四、在Catch和Finally里使用Await

在事先的版本里,C#支出公司觉得在Catch和Finally里选拔Await是不容许,而后天他俩在C#6里心想事成了它。

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

c# 6已经出去有一段时间了,前几天大家就详细地看一下那几个新的特性。

五、表达式方法体

一句话的表明式可以直接写成箭头函数,而不再必要大括号

class Program
{
private static string SayHello() => “Hello World”;
private static string JackSayHello() => $”Jack {SayHello()}”;

    static void Main(string[] args)
    {
        Console.WriteLine(SayHello());
        Console.WriteLine(JackSayHello());

        Console.ReadLine();
    }
}

三、 NameOf

千古,我们有众多的地方须求些硬字符串,导致重构相比困难,而且如若敲错字母很难察觉出来,比如

if (role == "admin")
{
}

WPF 也平日有诸如此类的代码

public string Name
{
  get { return name; }
  set
  {
      name= value;
      RaisePropertyChanged("Name");
  }
}

今昔有了C#6 NameOf后,我们得以这么

public string Name
{
  get { return name; }
  set
  {
      name= value;
      RaisePropertyChanged(NameOf(Name));
  }
}

  static void Main(string[] args)
    {
        Console.WriteLine(nameof(User.Name)); //  output: Name
        Console.WriteLine(nameof(System.Linq)); // output: Linq
        Console.WriteLine(nameof(List<User>)); // output: List
        Console.ReadLine();
    }

<strong>注意:
NameOf只会重临Member的字符串,若是前方有目标或者命名空间,NameOf只会回来
. 的终极一片段,
其余NameOf有诸多情形是不协理的,比如方法,关键字,对象的实例以及字符串和表明式</strong>

总结

地点一到八我以为都是比较有效的新特性,前面的多少个自我觉着用处不大,当然倘诺找到适当的使用处境应该有用,欢迎我们补充。

末段,祝大家编程欢腾。

一、字符串插值 (String Interpolation)

C# 6之前我们拼接字符串时索要那样

 var Name = "Jack";
 var results = "Hello" + Name;

或者

 var Name = "Jack";
 var results = string.Format("Hello {0}", Name);

但是C#6里大家就足以采纳新的字符串插值特性

  var Name = "Jack";
  var results = $"Hello {Name}";

上面只是一个不难易行的事例,想想若是有五个值要替换的话,用C#6的这一个新特色,代码就会大大减小,而且可读性比起从前大大增强

 Person p = new Person {FirstName = "Jack", LastName = "Wang", Age = 100};
 var results = string.Format("First Name: {0} LastName: {1} Age: { 2} ", p.FirstName, p.LastName, p.Age);

有了字符串插值后:

 var results = $"First Name: {p.FirstName} LastName: {p.LastName} Age: {p.Age}";

字符串插值不光是足以插简单的字符串,仍可以间接插入代码

Console.WriteLine($"Jack is saying { new Tools().SayHello() }");

 var info = $"Your discount is {await GetDiscount()}";

那么怎么样处理多语言呢?

俺们可以选取 IFormattable

上边的代码如何贯彻多语言?

 Double remain = 2000.5; 
 var results= $"your money is {remain:C}";  

# 输出 your money is $2,000.50

使用IFormattable 多语言

class Program
{
    static void Main(string[] args)
    {

        Double remain = 2000.5; 

       var results= ChineseText($"your money is {remain:C}");

        Console.WriteLine(results);
        Console.Read();
    }

    public static string ChineseText(IFormattable formattable)
    {
        return formattable.ToString(null, new CultureInfo("zh-cn"));
    }
}

# 输出  your money is ¥2,000.50

二、空操作符 ( ?. )

C# 6添加了一个 ?. 操作符,当一个对象或者属性职为空时径直重返null,
就不再继续执行前面的代码,在事先我们的代码里平时出现 NullException,
所以大家就需求加很多Null的判定,比如

 if (user != null && user.Project != null && user.Project.Tasks != null && user.Project.Tasks.Count > 0)
 {
   Console.WriteLine(user.Project.Tasks.First().Name);
}

近年来大家得以不用写 IF 直接写成如下那样

Console.WriteLine(user?.Project?.Tasks?.First()?.Name);

本条?.
特性不可是足以用来取值,也得以用于方法调用,固然目的为空将不开展任何操作,上边的代码不会报错,也不会有其它输出。

 class Program
{
    static void Main(string[] args)
    {
        User user = null;
        user?.SayHello();
        Console.Read();
    }
}

public class User
{
    public void SayHello()
    {
        Console.WriteLine("Ha Ha");
    }
}

还足以用来数组的索引器

class Program
{
    static void Main(string[] args)
    {
        User[] users = null;

        List<User> listUsers = null;

        // Console.WriteLine(users[1]?.Name); // 报错
        // Console.WriteLine(listUsers[1]?.Name); //报错

        Console.WriteLine(users?[1].Name); // 正常
        Console.WriteLine(listUsers?[1].Name); // 正常

        Console.ReadLine();
    }
}

<strong>注意:
下边的代码固然可以让我们少些很多代码,而且也减小了空非常,但是我们却要求小心使用,因为部分时候大家真的是内需抛出空分外,那么使用那几个特点反而隐藏了Bug</strong>

相关文章