设为首页 收藏本站
查看: 2981|回复: 0

[经验分享] 背水一战 Windows 10 (43)

[复制链接]

尚未签到

发表于 2017-6-27 16:30:11 | 显示全部楼层 |阅读模式
  [源码下载]




背水一战 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 = 123456;
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(100);
return 1;
}
// 在 c#7 中异步返回 int 可以这么写,ValueTask 是值类型,提高了效率
// 注:需要通过 nuget 引用 System.Threading.Tasks.Extensions
private async ValueTask<int> GetNumber2()
{
await Task.Delay(100);
return 1;
}
}
}
  
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 = 1;
ref int b = ref a; // 值类型变量 b 引用了值类型变量 a
a = 2;
lblMsg.Text = a.ToString();
lblMsg.Text += Environment.NewLine;
// 值类型返回值变为引用类型的示例
int[] array = { 1, 2, 3, 4, 5 };
ref int x = ref GetByIndex(array, 2); // 值类型变量 x 引用了 GetByIndex(array, 2)
x = 99;
lblMsg.Text += array[2].ToString();
lblMsg.Text += Environment.NewLine;
}
// 返回的值类型变为引用类型
private ref int GetByIndex(int[] array, int index)
{
return ref array[index];
}

// 模式匹配(pattern matching)
private void sample2()
{
object a = 1;
// 声明 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 > 0:
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: 1, UserName: "webabcd");
lblMsg.Text += $"{obj1.UserId}, {obj1.UserName}";
lblMsg.Text += Environment.NewLine;
var obj2 = (1, "webabcd");
lblMsg.Text += $"{obj2.Item1}, {obj2.Item2}";
lblMsg.Text += Environment.NewLine;
(int id, string name) = (1, "webabcd");
lblMsg.Text += $"{id}, {name}";
lblMsg.Text += Environment.NewLine;
}
private (int UserId, string UserName, DateTime CreateTime) GetUser1()
{
return (1, "webabcd", DateTime.Now);
}
private (int UserId, string UserName, DateTime CreateTime) GetUser2()
{
return (UserId: 1, UserName: "webabcd", CreateTime: DateTime.Now);
}
private (int, string, DateTime) GetUser3()
{
return (1, "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 1;
}
}
}
}
  
OK
[源码下载]

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-388825-1-1.html 上篇帖子: 几种Windows进程通信 下篇帖子: 【使用教程】论Windows下必备的抓包工具Fiddler2如何安装证书(查看Https)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表