C#7.0新特性

C#7.0 中新增了非常有用的新功能,如果您是.NET开发者,建议花些时间来了解这些新特性。

1、Out 变量

在之前版本的 C# 中,使用 out 变量,您需要先定义并申明变量,如下所示。

static void Main(string[] args)

{

    int value; //需要预先定义    if (int.TryParse("123", out value))

    {

        Console.WriteLine(value);

    }

}

在 C#7.0 中,可以在传参的同时进行申明,当然也可以将 int 改成 var 匿名类型。

static void Main(string[] args)

{

    if (int.TryParse("123", out int value))

    {

        Console.WriteLine(value);

    }

}


2、元组特性

当编写一个函数时,有时需要返回多个结果,而且这个结果只用一次,不必创建对象,用元组就可返回多个结果,首选需要安装 System.ValueTuple 这个库。

install-package System.ValueTuple

通过下面的方法,就可使用元组返回多个值。

public static (string v1, string v2, string v3) GetValues()

{

    return ("零度", "编程", "官网");

}

也可以只给定类型不设置参数名来定义返回元组的方法。

public static (string, string, string) GetValues()

{

    return ("零度", "编程", "官网");

}

可以通过以下的方式来调用元组方法。

(string a, string b, string c) = GetValues();Console.WriteLine(a + b + c);

也可直接使用 var 匿名类型来接收元组方法的返回值,与以上调用方式等效。

var result = GetValues();

Console.WriteLine(result.v1 + result.v2 + result.v3);


3、解析方法

解析方法可以将方法返回的元组进行解析,解析方法很灵活,可以通过以下几种解析方法解析元祖。

(string first, string middle, string last) = GetValues();Console.WriteLine(first + middle + last);

在内部使用 var 匿名类型的解析方法。

(var first, var middle, var last) = GetValues();

甚至可以将 var 放在括号外进行简写。

var (first, middle, last) = GetValues();

当然,解析方法不仅仅适用于元组,如要它拥有如下的形式,就能够使用解析方法。

public void Deconstruct(out T1 x1, ..., out Tn xn) { ... }

为类定义一个解析方法(也可以是扩展方法),需要符合如上的 Deconstruct 格式,如下所示。

public class Book{

    public int BookID { get; set; }

    public double BookPrice { get; set; }

    public void Deconstruct(out int id, out double price)

   {

               id = BookID; price = BookPrice;

    }

}

在外部可以使用如下的方式调用一个类的解析方法,系统会自动推断出 book 对象 Deconstruct 方法并解析。

Book book = new Book { BookID = 123, BookPrice = 88.88 };

(int id, double price) = book;Console.WriteLine(price);

4、模式匹配

之前,我们判断一个对象是否兼容某个类型,一般使用 is 关键字,兼容则进行隐式类型转换,然后参与运算,代码如下。

static void Main(string[] args)

{

    object objectValue = 123;

    if (objectValue is int)

    {

        int intValue = (int)objectValue;

        int sum = intValue + 321;

        Console.WriteLine(sum);

    }

}

现在,我们可以使用模式匹配特性将类型判断与转换同时进行。

static void Main(string[] args)

{

    object objectValue = 123;

    if (objectValue is int intValue)

    {

        int sum = intValue + 321;

        Console.WriteLine(sum);

    }

}

当然,除了 if 语句进行模式匹配外,switch 语句也支持模式匹配。

static dynamic AddValue(object value)

{

    dynamic result=null;

    switch (value)

    {

        case int b:

            result = b++;

            break;

        case string c:

            result = c + "零度";

            break;

    }

    return result;

}

5、局部函数

在 C#7 中可以在函数内部定义函数并调用,下面的代码在 Main 函数中定义一个 Add 函数,然后调用这个函数。

static void Main(string[] args)

{

    int Add(int value1, int value2)

    {

        return value1 + value2;

    }

    int result = Add(111, 222);

    Console.WriteLine(result);

}

6、数值文字

为了提高数值类型的可读性,C#7 中引入数值可读性,使用此特性,在不影响最终结果的情况下,通过下划线提高数值的可读性。

static void Main(string[] args)

{   

    var intValue = 123_456_000_000; //表示123456000000

    var hexValue = 0xAB_CD_EF; //0x表示十六进制   

     var binValue = 0b1010_1011_1100_1101_1110_1111; //0b表示二进制

 }

既然是数值类型的分割,那么同样可用于 decimal、float 和 double 类型。

7、方法主体使用表达式

在 C#6 中定义函数时,可以将一个 Lambda 表达式作为函数主体,在 C#7 中表达式可以用在访问器、构造器和析构器。

public class Person{

    public void PrintName() => Console.WriteLine(firstName);

    private string firstName = string.Empty;

    public Person(string name) => firstName=name; //构造函数  

      ~Person() => firstName=string.Empty; //析构函数  

     public string FirstName

    {

        get => firstName; //GET访问器       

        set => firstName = value; //SET访问器 

    }

}

8、异常表达式

之前,通过条件判断抛出指定的异常。

public void WriteString(string parameter)

{

    if (parameter == null)

    {

        throw new ArgumentNullException();

    }

    Console.WriteLine(parameter);

}

现在,可以将异常抛出作为表达式来使用。

public void WriteString2(string parameter)

{

    parameter = parameter?? throw new ArgumentNullException();

    Console.WriteLine(parameter);

}

9、将 ref 用于变量和返回值

之前,ref 关键字可将值类型通过引用进行传递,现在 ref 可以用于局部变量和返回值,以下代码将变量 x 的引用传递给 y 变量,也就是说 y 与 x 引用相同的内存地址,下面的代码输出 x 的值为 2。

static void Main(string[] args)

{

    int x = 3;

    ref int y = ref x;

    y = 2;

    Console.WriteLine(x);

}

在方法返回值中使用 ref 引用变量。

static ref int GetValue(int[] array, int index) => ref array[index];

以上函数可以使用如下的方式进行调用。

int[] array = { 1, 2, 3, 4, 5 };ref int x = ref GetValue(array, 2);

来源:零度 C#7.0 中的语言新特性

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • 前言 最先接触编程的知识是在大学里面,大学里面学了一些基础的知识,c语言,java语言,单片机的汇编语言等;大学毕...
    oceanfive阅读 3,040评论 0 7
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,594评论 18 139
  • 1. [C#语言基础]请简述拆箱和装箱。 答: 装箱操作: 值类型隐式转换为object类型或由此值类型实现的任何...
    胤醚貔貅阅读 4,767评论 1 29
  • 分享给大家一个很久之前写的一个纯C#控制台 3D闯关游戏代码 直接复制就可以用 初学者可以看看 学习一下编程思想还...
    Magic_Dong阅读 4,101评论 3 0
  • 曾经有过一些旅行,总在路上碰到一些新的朋友。在青年旅舍里,每天人来人往,见面的人从来不问多余的事情,看得顺眼,彼此...
    蔡建斌阅读 144评论 0 0