zoukankan      html  css  js  c++  java
  • C# 6.0新特性

    因为在博客中给出的代码大多数都使用了C#6.0的新特性,如果各位对C#6.0还不了解,可以简单的看一下这篇随笔。o( ̄▽ ̄)d

    先来看一个Point类

        public class Point
        {
            public int X { get; set; }
    
            public int Y { get; set; }
    
            public Point(int x, int y)
            {
                X = x;
                Y = y;
            }
    
            public double Dist
            {
                get { return Math.Sqrt(X * X + Y * Y); }
            }
    
            public override string ToString()
            {
                return String.Format("({0}, {1})", X, Y);
            }
        }

    现在我们一步步来看在C#6.0中的改进

    1->在以前版本的C#代码中所有的自动属性都必须有Setter,但是现在可以没有了。注意,不能只有Setter

        public class Point
        {
            public int X { get; }
    
            public int Y { get; }

         public double Dist { get { return Math.Sqrt(X * X + Y * Y); } } public override string ToString() { return String.Format("({0}, {1})", X, Y); } }

    2->同时现在也可以为自动属性直接设置初值,无需放到构造函数中

        public class Point
        {
            public int X { get; } = 2;
    
            public int Y { get; set; } = 1;

         public double Dist { get { return Math.Sqrt(X * X + Y * Y); } } public override string ToString() { return String.Format("({0}, {1})", X, Y); } }

    3->使用静态成员

      3.1在上面的代码中看一看到调用Sqrt函数需要使用Math开头,写一次两次还好,如果一个类中大规模使用Sqrt每次都要先写一个Math会不会太麻烦了!

    现在我们来看看如何改进。

    首先在命名空间中添加下面这一行代码

    using static System.Math;

    规则是 using + static + 静态类命名空间

    于是Dist属性就可改成下面这样

            public double Dist
            {
                get { return Sqrt(X * X + Y * Y); }
            }

      3.2上面的规则也适用于枚举类型

    using static Desktop.Color;
    
    namespace Desktop
    {
        enum Color
        {
            Yellow,
            Red
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine(Yellow);
                Console.ReadKey();
            }
        }
    }

    4->关于String.Format()方法的改进

    这是经典写法

                return String.Format("({0}, {1})", X, Y);

    接下来一步步简化(先将String.Format用一个$代替)

                return $"({0}, {1})", X, Y);

    然后将0,1两个占位符直接换成X,Y

    return $"({X}, {Y})";

    好的化简完成。

    5->对于Lambda表达式的改进

    以前写匿名函数的时候可以写成一行,现在一般的函数也可以了

    ToString()函数可以改写成如下形式

    public override string ToString() => $"({X}, {Y})";

    类似的属性可以改成这样

    public double Dist => Sqrt(X * X + Y * Y);

    注意属性是没有()的

     简化后的Point类是这样的

        public class Point
        {
            public int X { get; } = 2;
    
            public int Y { get; set; } = 1;

    public double Dist => Sqrt(X * X + Y * Y); public override string ToString() => $"({X}, {Y})"; }

    6->索引初始化

    先来看一段Json.Net的代码

    public JObject ToJson()
            {
                var result = new JObject();
                result["X"] = X;
                result["Y"] = Y;
                return result;
            }

    改进后的代码可以这么写

            public JObject ToJson()
            {
                var result = new JObject()
                {
                    ["X"] = X,
                    ["Y"] = Y
                };
                return result;
            }

    最终可以化简成一行代码

    public JObject ToJson() => new JObject() { ["X"] = X, ["Y"] = Y };

    7-> ?.运算符

    ?.运算符其实很简单,主要就是检查变量是否为null,如果不为null那就执行.

    先来看一个函数,这个判断语句中大部分的检查都是在

            public static Point FromJson(JObject json)
            {
                if (json != null &&
                    json["X"] != null &&
                    json["X"].Type == JTokenType.Integer &&
                    json["Y"] != null &&
                    json["Y"].Type == JTokenType.Integer
                    )
                {
                    return new Point((int)json["X"], (int)json["Y"]);
                }
                return null;
            }

    这个函数可以用?.运算符化简成

            public static Point FromJson(JObject json)
            {
                if (json != null &&
                    json["X"]?.Type == JTokenType.Integer &&
                    json["Y"]?.Type == JTokenType.Integer
                    )
                {
                    return new Point((int)json["X"], (int)json["Y"]);
                }
                return null;
            }

    如果json["x"]为null,那么就不执行. 如果json["x"]不为null,那么就会执行.然后判断类型是否为int

    所以代码可以被再次化简

            public static Point FromJson(JObject json)
            {
                if (json?["X"]?.Type == JTokenType.Integer &&
                    json?["Y"]?.Type == JTokenType.Integer
                    )
                {
                    return new Point((int)json["X"], (int)json["Y"]);
                }
                return null;
            }

    ?.还有一个比较大的用处在触发事件的时候

    OnChanged(this, args);

    如果此时OnChanged为空显然是不行的所以呢,可以改写成这样

    if (OnChanged == null)
    {
        OnChanged(this, args);
    }

    如果很不幸的另外一个线程就在判断之后,触发事件之前,再次设置OnChanged变为null,同样会导致错误

    为了保证线程安全

    需要先Copy一份,但是这样写显然就。。。

    var onChanged = OnChanged;
    if (onChanged != null)
    {
       onChanged(this, args);
    }

    现在可以改写成这样

    OnChanged?.(this, args);

    8-> 支持在catch和finally块中使用await

    好滴以上就是C#6.0的一些新特性,这些改进个人感觉还是非常实用的!C#团队辛苦咯!

    参考视频连接

    每一个不曾追梦的日子都是对生命的辜负。
  • 相关阅读:
    python基础知识(集合)
    python基础知识(字典)
    python基础知识(循环语句)
    Python基础知识(程序结构)
    python基础知识(正则表达式)
    python基础知识(字符串)
    jmeer_09_JDBC Request
    性能总结_01
    性能02_
    jmeter_07正则提取器_JDBC_Connection_Configuration
  • 原文地址:https://www.cnblogs.com/zhuimengdev/p/5072752.html
Copyright © 2011-2022 走看看