[源码下载]

背水一战 Windows 10 (43) - C# 7.0 新特性

作者:webabcd

介绍
背水一战 Windows 10 之 C# 7.0 新特性

  • 介绍 C# 7.0 的新特性

示例
1、C# 7.0 示例 1: out 变量, 数字语法改进, 值类型的异步返回
CSharp7/Demo1.xaml.cs

/*
* C# 7 示例 1
* out 变量, 数字语法改进, 值类型的异步返回
*/ using System;
using System.Threading.Tasks;
using Windows.UI.Xaml.Controls; namespace Windows10.CSharp7
{
public sealed partial class Demo1 : Page
{
public Demo1()
{
this.InitializeComponent(); sample1();
sample2();
sample3();
} // out 变量(out-variables)
private void sample1()
{
// 这是之前的写法,需要预先声明变量
string s;
OutSample(out s);
lblMsg.Text += s;
lblMsg.Text += Environment.NewLine; // 这是 c#7 的写法,不用预先声明变量了
OutSample(out string ss);
lblMsg.Text += ss;
lblMsg.Text += Environment.NewLine; // 这是 c#7 的写法,不用预先声明变量了,并且可以使用 var
OutSample(out var sss);
lblMsg.Text += sss;
lblMsg.Text += Environment.NewLine;
}
private void OutSample(out string str)
{
str = "xyz"; /*
* 注:
* 1、对于 out 类型来说,是在方法内部初始化的,在 c#7 之前需要在方法外部声明(这显得没有必要,所以有了如今的改进)
* 2、对于 ref 类型来说,是不可能改成 out 这种新方式的,因为 ref 是引用,其作用是方法外部初始化,方法内部改之
*/
} // 数字语法改进(numeric literal syntax improvements)
private void sample2()
{
int a1 = ;
int a2 = 123_456; // 允许数字中出现“_”来提高可读性
lblMsg.Text += a1.ToString();
lblMsg.Text += Environment.NewLine;
lblMsg.Text += a2.ToString();
lblMsg.Text += Environment.NewLine; int b1 = 0xABCDEF;
int b2 = 0xAB_CD_EF; // 允许数字中出现“_”来提高可读性
lblMsg.Text += b1.ToString();
lblMsg.Text += Environment.NewLine;
lblMsg.Text += b2.ToString();
lblMsg.Text += Environment.NewLine;
} // 值类型的异步返回(generalized async return types)
private async void sample3()
{
lblMsg.Text += (await GetNumber1()).ToString();
lblMsg.Text += Environment.NewLine; lblMsg.Text += (await GetNumber2()).ToString();
lblMsg.Text += Environment.NewLine;
}
// 在 c#7 之前异步返回 int 是这么写的,Task 是引用类型
private async Task<int> GetNumber1()
{
await Task.Delay();
return ;
}
// 在 c#7 中异步返回 int 可以这么写,ValueTask 是值类型,提高了效率
// 注:需要通过 nuget 引用 System.Threading.Tasks.Extensions
private async ValueTask<int> GetNumber2()
{
await Task.Delay();
return ;
}
}
}

2、C# 7.0 示例 2: 值类型变量的引用和值类型返回值的引用, 模式匹配, 元组
CSharp7/Demo2.xaml.cs

/*
* C# 7 示例 2
* 值类型变量的引用和值类型返回值的引用, 模式匹配, 元组
*/ using System;
using Windows.UI.Xaml.Controls; namespace Windows10.CSharp7
{
public sealed partial class Demo2 : Page
{
public Demo2()
{
this.InitializeComponent(); sample1();
sample2();
sample3();
} // 值类型变量的引用和值类型返回值的引用(ref locals and returns)
private void sample1()
{
// 值类型变量变为引用类型的示例
int a = ;
ref int b = ref a; // 值类型变量 b 引用了值类型变量 a
a = ;
lblMsg.Text = a.ToString();
lblMsg.Text += Environment.NewLine; // 值类型返回值变为引用类型的示例
int[] array = { , , , , };
ref int x = ref GetByIndex(array, ); // 值类型变量 x 引用了 GetByIndex(array, 2)
x = ;
lblMsg.Text += array[].ToString();
lblMsg.Text += Environment.NewLine;
}
// 返回的值类型变为引用类型
private ref int GetByIndex(int[] array, int index)
{
return ref array[index];
} // 模式匹配(pattern matching)
private void sample2()
{
object a = ;
// 声明 int b,如果 a 是 int 类型则将 a 赋值给 b
if (a is int b)
{
lblMsg.Text += b.ToString();
lblMsg.Text += Environment.NewLine;
} switch (a)
{
// 声明 int c,如果 a 是 int 类型则将 a 赋值给 c,如果 c 大于 0 则执行此 case
case int c when c > :
lblMsg.Text += "case int c when c > 0: " + c;
lblMsg.Text += Environment.NewLine;
break;
// 声明 string c,如果 a 是 string 类型则将 a 赋值给 c
case string c:
lblMsg.Text += "case string c: " + c;
lblMsg.Text += Environment.NewLine;
break;
}
} // 元组(Tuples)
// 注:需要通过 nuget 引用 System.ValueTuple
private void sample3()
{
// Tuples 特性是从 System.Tuple<T1, T2, T3...> 进化而来的
// 注:当有多个返回值时,使用 Tuples 特性是非常方便的 var user1 = GetUser1();
lblMsg.Text += $"{user1.UserId}, {user1.UserName}, {user1.CreateTime}";
lblMsg.Text += Environment.NewLine; var user2 = GetUser2();
lblMsg.Text += $"{user2.UserId}, {user2.UserName}, {user2.CreateTime}";
lblMsg.Text += Environment.NewLine; var user3 = GetUser3();
lblMsg.Text += $"{user3.Item1}, {user3.Item2}, {user3.Item3}";
lblMsg.Text += Environment.NewLine; (int UserId, string UserName, DateTime CreateTime) = GetUser1();
lblMsg.Text += $"{UserId}, {UserName}, {CreateTime}";
lblMsg.Text += Environment.NewLine; var obj1 = (UserId: , UserName: "webabcd");
lblMsg.Text += $"{obj1.UserId}, {obj1.UserName}";
lblMsg.Text += Environment.NewLine; var obj2 = (, "webabcd");
lblMsg.Text += $"{obj2.Item1}, {obj2.Item2}";
lblMsg.Text += Environment.NewLine; (int id, string name) = (, "webabcd");
lblMsg.Text += $"{id}, {name}";
lblMsg.Text += Environment.NewLine;
}
private (int UserId, string UserName, DateTime CreateTime) GetUser1()
{
return (, "webabcd", DateTime.Now);
}
private (int UserId, string UserName, DateTime CreateTime) GetUser2()
{
return (UserId: , UserName: "webabcd", CreateTime: DateTime.Now);
}
private (int, string, DateTime) GetUser3()
{
return (, "webabcd", DateTime.Now);
}
}
}

3、C# 7.0 示例 3: 表达式抛出异常, lambda 表达式作用于构造函数或属性, 局部函数
CSharp7/Demo3.xaml.cs

/*
* C# 7 示例 3
* 表达式抛出异常, lambda 表达式作用于构造函数或属性, 局部函数
*/ using System;
using Windows.UI.Xaml.Controls; namespace Windows10.CSharp7
{
public sealed partial class Demo3 : Page
{
public Demo3()
{
this.InitializeComponent(); sample1();
sample2();
sample3();
} // 表达式抛出异常(throw expressions)
private void sample1()
{
try
{
string a = null;
// 支持在表达式中抛出异常
string b = a ?? throw new Exception("ex");
}
catch (Exception ex)
{
lblMsg.Text += ex.ToString();
lblMsg.Text += Environment.NewLine;
}
} // lambda 表达式作用于构造函数或属性(more expression-bodied members)
// 注:在 c#6 中已经支持了 lambda 表达式作用于字段或方法
private void sample2()
{
MyClass obj = new MyClass("webabcd");
lblMsg.Text += obj.Text;
lblMsg.Text += Environment.NewLine;
}
public class MyClass
{
private string _text; public MyClass(string text) => _text = text; // lambda 表达式作用于构造函数 public string Text // lambda 表达式作用于属性
{
get => _text;
set => _text = value ?? "default text";
}
} // 局部函数(local functions)
private void sample3()
{
int a = GetNumber();
lblMsg.Text += a.ToString();
lblMsg.Text += Environment.NewLine; // 支持局部函数了
int GetNumber()
{
return ;
}
}
}
}

OK
[源码下载]

背水一战 Windows 10 (43) - C# 7.0 新特性的更多相关文章

  1. 背水一战 Windows 10 (1) - C# 6.0 新特性

    [源码下载] 背水一战 Windows 10 (1) - C# 6.0 新特性 作者:webabcd 介绍背水一战 Windows 10 之 C# 6.0 新特性 介绍 C# 6.0 的新特性 示例1 ...

  2. 背水一战 Windows 10 (47) - 控件(ScrollViewer 特性): Chaining, Rail, Inertia, Snap, Zoom

    [源码下载] 背水一战 Windows 10 (47) - 控件(ScrollViewer 特性): Chaining, Rail, Inertia, Snap, Zoom 作者:webabcd 介绍 ...

  3. Hadoop3.0新特性介绍,比Spark快10倍的Hadoop3.0新特性

    Hadoop3.0新特性介绍,比Spark快10倍的Hadoop3.0新特性 Apache hadoop 项目组最新消息,hadoop3.x以后将会调整方案架构,将Mapreduce 基于内存+io+ ...

  4. 背水一战 Windows 10 (83) - 用户和账号: 数据账号的添加和管理, OAuth 2.0 验证

    [源码下载] 背水一战 Windows 10 (83) - 用户和账号: 数据账号的添加和管理, OAuth 2.0 验证 作者:webabcd 介绍背水一战 Windows 10 之 用户和账号 数 ...

  5. 背水一战 Windows 10 (11) - 资源: CustomResource, ResourceDictionary, 加载外部的 ResourceDictionary 文件

    [源码下载] 背水一战 Windows 10 (11) - 资源: CustomResource, ResourceDictionary, 加载外部的 ResourceDictionary 文件 作者 ...

  6. 背水一战 Windows 10 (32) - 控件(选择类): Selector, ComboBox

    [源码下载] 背水一战 Windows 10 (32) - 控件(选择类): Selector, ComboBox 作者:webabcd 介绍背水一战 Windows 10 之 控件(选择类) Sel ...

  7. 背水一战 Windows 10 (22) - 绑定: 通过 Binding 绑定对象, 通过 x:Bind 绑定对象, 通过 Binding 绑定集合, 通过 x:Bind 绑定集合

    [源码下载] 背水一战 Windows 10 (22) - 绑定: 通过 Binding 绑定对象, 通过 x:Bind 绑定对象, 通过 Binding 绑定集合, 通过 x:Bind 绑定集合 作 ...

  8. 背水一战 Windows 10 (17) - 动画: ThemeTransition(过渡效果)

    [源码下载] 背水一战 Windows 10 (17) - 动画: ThemeTransition(过渡效果) 作者:webabcd 介绍背水一战 Windows 10 之 动画 ThemeTrans ...

  9. 背水一战 Windows 10 (16) - 动画: ThemeAnimation(主题动画)

    [源码下载] 背水一战 Windows 10 (16) - 动画: ThemeAnimation(主题动画) 作者:webabcd 介绍背水一战 Windows 10 之 动画 PopInThemeA ...

随机推荐

  1. (转)用webbrowser做的网站登陆程序,如何获取cookie并且保存在程序中 (IE8有效) ,用途嘛,你懂的。

    今天帮朋友做了个工具,用webbrowser做的,用户使用用户名密码登陆网站后,需要在后台下载和分析一些页面. 分析页面使用的是htmlparser .net版 里面唯一需要解决的问题是,登陆后的co ...

  2. 【RabbitMQ】 RabbitMQ配置开机启动

    环境 系统:Linux(CentOS 7.2) Erlang环境:21.1(安装参考[Erlang]源码安装) RabbitMQ:3.7.9(安装参考[RabbitMQ] RabbitMQ安装) 配置 ...

  3. linux_开启mysql服务

    想要连接mysql的时候必须先开启mysql的服务 service mysqld start mysql -u root -p 输入密码

  4. IDEA的GUI连接数据库写入SQL语句的问题总结

    一.首先是建立游标的对象statement 插入数据excuteUpdate需要的是一个整型的参数,所以建立的对象要是一个int型的数据类型,才可以执行SQL语句excuteQuery是一个字符类型在 ...

  5. php-fpm 的 pm.start_servers 参数调整

    大家注意一下 在 php-fpm 的配置文件中, pm.start_servers 必须是介于  pm.min_spare_servers 和  pm.max_spare_servers  这个值之间 ...

  6. The XOR Largest Pair(Tire字典树应用)

    题目链接:传送门 思路:建立一个32位的字典树,对每一个要插入的数字查找它异或的最大值(就是尽量全部二进制的值都相反), 然后获得两个数异或的最大值. #include<iostream> ...

  7. 关于Excel分析图插入到论文的问题

    为了保证插入到latex图片不失真,可将Excel中的图进行如下操作: 1.将Excel分析图另存为.pdf格式: 2.利用Adobe acrobat裁剪掉空白的部分,另存为.eps格式: 3.将ep ...

  8. 第31章:MongoDB-索引--复合索引

    ①复合索引 对多个字段创建索引被称为复合索引或者组合索引 ②创建组合索引 创建组合索引(以后台模式创建) db.user.ensureIndex({"username": 1, & ...

  9. BZOJ 4765 普通计算姬 (分块 + BIT)

    4765: 普通计算姬 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 1547  Solved: 329[Submit][Status][Discus ...

  10. nginx location配置和rewrite写法

    location = / { # 精确匹配 / ,主机名后面不能带任何字符串 [ configuration A ] } location / { # 因为所有的地址都以 / 开头,所以这条规则将匹配 ...