美文网首页
C#6.0新增语法糖

C#6.0新增语法糖

作者: 简书冷雨 | 来源:发表于2017-02-24 23:26 被阅读0次

    扩展自动属性语法

    自动属性初始化表达式。

    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;
    }
    

    相关文章

      网友评论

          本文标题:C#6.0新增语法糖

          本文链接:https://www.haomeiwen.com/subject/aisbwttx.html