• C# 7.0


    下面说的C# 7.0功能将在未来发布,首先需要安装Visual Studio 15 Preview 4,听说这个版本安装很快。

    C# 7.0的功能主要是数据处理,让代码更简洁,让代码性能更高

    让代码简单这个我觉得不如6.0,性能是Iot,C#速度差,垃圾wr就让C#可以访问内存直接,这个下面没有说

    比较大修改是可以使用Tuples 来多个返回,其实是抄袭了某脚本

    多返回这个在之前也有做,他这样就是小改。

    修改大的有Case 可以判断类型,其实这个使用是我们有类 a,类b、c继承a,这时有用

    如果觉得这个和我一样觉得没用,可以去Visual studio 按反馈喷

    如果好奇他是怎么弄,可以查看https://github.com/dotnet/roslyn

    out 返回值定义

    我们以前要使用out 总是需要在外面定义我们变量。

    
      public void PrintCoordinates(Point p)
    
      {
    
        int x, y; // 在外面定义
    
        p.GetCoordinates(out x, out y);
    
        WriteLine($"({x}, {y})");
    
      }
    

    在7.0我们可以使用在out定义我们变量,这样看起来不是在一个区域,但是可以减少我的代码

    
    public void PrintCoordinates(Point p)
    
    {
    
        p.GetCoordinates(out int x, out int y);
    
        WriteLine($"({x}, {y})");
    
    }
    

    在out定义类型,定义可以用var

    看到这我才说这样有用,如果我们开始没有确定我们返回的是什么,然后直接定义,需要修改地方多,但是如果我们使用Var就可以让我们定义修改少,一般在写就需要先想我们需要用什么,不要总是改

    如果我们使用一个返回为bool,那么可以在{使用out的值

    
    public void PrintStars(string s)
    
    {
    
        //转换,可以是数字,显示
    
        if (int.TryParse(s, out var i)) { WriteLine(new string('*', i)); }
    
        else { WriteLine("Cloudy - no stars tonight!"); }
    
    }
    

    如果有返回值我们不需要,可以out *,这样我们就不用知道这个返回值,原先不需要使用我还要想一个变量,然后vs说我这个没有使用,现在我们直接就不给他名

    在我们下面有返回多个,这时不需要的可以用*

    模式匹配

    C# 7.0可以使用is一部分代替as

    我们需要判断一个值是否是一个类型,如果是那么赋值

    o is int i

    那么我们就可以直接使用i

    在我们一个判断,如果我们存在了object o是int,那么我们就使用int i=(int)o;

    如果我们object不是int,那么转换object o是string,string s=(string)o;

    int.TryParse(s,out i);

    我们可以简化,判断是不是int,如果是给i,这时就返回true

    然后判断是不是string,是就转,成功使用i

    if (o is int i || (o is string s && int.TryParse(s, out i)) { /* use i */ }

    我们在Case可以选择类型

    
    switch(shape)
    
    {
    
        case Circle c:
    
            WriteLine($"circle with radius {c.Radius}");
    
            break;
    
        case Rectangle s when (s.Length == s.Height):
    
            WriteLine($"{s.Length} x {s.Height} square");
    
            break;
    
        case Rectangle r:
    
            WriteLine($"{r.Length} x {r.Height} rectangle");
    
            break;
    
        default:
    
            WriteLine("<unknown shape>");
    
            break;
    
        case null:
    
            throw new ArgumentNullException(nameof(shape));
    
    }
    

    case顺序很重要,default在后面,即使他后面有语句

    Tuples

    以前我们需要返回多个有点难,可以使用out参数,可以Tuples

    
    (string, string, string) LookupName(long id) // tuple return type
    
    {
    
        ... // 返回多个数据,我们在数据拿到多个数据
    
        return (first, middle, last); // tuple literal
    
    }
    

    var names = LookupName(id);

    我们这样用第一返回值:names.Item1和原来几乎不改,这样对于返回值不好,因为我们难以去记

    我们要给他一个好记的

    (string first, string middle, string last) LookupName(long id)

    我们使用第一个names.first,这样使用就不会难,可以使用我们需要的名字

    返回可以使用return (first, middle, last);,如果定义了名称,可以使用

    return last:last,first:first

    我们可以使用多个var来返回

    (string first, string middle, string last) = LookupName(id1);

    第一个first就是返回的第一个,我们可以使用var ,因为我们不需要定义类型(var fist,var midd)=Lookup(id);

    如果我们有多个var,那么我们可以简单var (first, middle, last) = LookupName(id1);

    我们不关系第二个返回值,可以使用(var first,*)=Lookup(id);

    本地函数

    我们可以在函数里面定义函数,这是本地

    这个在很多垃圾语言都有

    
    public int Fibonacci(int x)
    
    {
    
        if (x < 0) throw new ArgumentException("Less negativity please!", nameof(x));
    
        return Fib(x).current;
    
    //下面本地函数
    
        (int current, int previous) Fib(int i)
    
        {
    
            if (i == 0) return (1, 0);
    
            var (p, pp) = Fib(i - 1);
    
            return (p + pp, p);
    
        }
    
    }
    

    改进常量

    我们有比较长数字,那么我们在定义需要比较难知道他是否写对

    我们可以使用,下划线,这样是分割,可以数我们写了多少数字,可以看我们是不是写错

    
    var d = 123_456;
    
    var x = 0xAB_CD_EF;
    

    我们还可以定义2进制,原来是无法定义

    var b = 0b1010_1011_1100_1101_1110_1111;

    这个主要在二进制好,原先的使用true和false,如果还要使用,是用byte转换,如果Iot,我们需要定义二进制,要是使用原的还是难,我就觉得这个功能好。可以分割,我们二进制容易打着就不对,有了分割可以看出没几个,这样看代码简单,这个功能应该是原先就可得到,现在使用_觉得还是没有用。

    ref returns 返回值

    我们返回的是引用,现在返回可以是值,我们返回数组中的一个值,那么修改这个值,因为放进引用,我们输出数组是修改的值

    
    public ref int Find(int number, int[] numbers)
    
    {
    
        for (int i = 0; i < numbers.Length; i++)
    
        {
    
            if (numbers[i] == number) 
    
            {
    
                return ref numbers[i]; // return the storage location, not the value
    
            }
    
        }
    
        throw new IndexOutOfRangeException($"{nameof(number)} not found");
    
    }
    
    int[] array = { 1, 15, -39, 0, 7, 14, -12 };
    
    ref int place = ref Find(7, array); 
    
    place = 9; // 修改
    
    WriteLine(array[4]); // 9
    

    https://blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in-csharp-7-0/

    知识共享许可协议
    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

  • 相关阅读:
    package.json中 npm依赖包版本前的符号的意义
    移动端1px的border
    react下将输入的汉字转化为拼音
    h5打开App的方法。
    图片在缩放截取后以固定尺寸上传到第三方
    图片裁切,上传,自动匹配颜色。
    ReactNative学习一
    MySQL数据库8(二)MySQL基本介绍
    MySQL数据库8(一)SQL简介

  • 原文地址:https://www.cnblogs.com/lindexi/p/12087532.html
Copyright © 2020-2023  润新知