C#7.0中的解构功能---Deconstruct
解构元组
C#7.0新增了诸多功能,其中有一项是新元组(ValueTuple),它允许我们可以返回多个值,并且配合解构能更加方便的进行工作,如下面例子
static void Main(string[] args)
{
(var name, var age) = GetUser();
Console.WriteLine($"name:{name}\nage:{age}");
}
public static (string name,int age) GetUser()
{
return ("张三", );
}
可以看到解构元组可以写出优雅的代码,并且可以使用类型推断,但在这里解构元组并不是重点,所以不过多关注,下面说一个有趣的功能
解构对象
解构能力并不是只能解构元组,他还有一个更加有意思的功能,就是解构对象。是不是听起来挺有意思。
static void Main(string[] args)
{
var user = new User
{
Name = "张三",
Age = ,
Email = "zhangsan@126.com",
Sex="男" };
(var name, var email) = user;
Console.WriteLine($"name:{name}\nemail:{email}");
}
上面代码是不是很惊奇,反正我第一次看到时特别惊讶,也感觉特别有意思,那么这到底怎么实现的呢,其实只是在类中添加一个解构函数(Deconstruct)就可以,解构参数方法名称必须是Deconstruct,返回值必须是void,参数列表必须是out
public class User
{
public string Name { get; set; }
public string Email { get; set; }
public int Age { get; set; }
public string Sex { get; set; }
//解构函数
public void Deconstruct(out string name,out string email)
{
name = Name;
email = Email;
}
}
是不是感觉特别简单,哈哈,
解构函数还支持重载
class Program
{
static void Main(string[] args)
{
var user = new User
{
Name = "张三",
Age = ,
Email = "zhangsan@126.com",
Sex="男"
};
(var name1, var email1) = user;
Console.WriteLine($"name:{name1}\temail:{email1}");
(var name2,var age2, var email2) = user;
Console.WriteLine($"name:{name2}\tage:{age2}\temail:{email2}");
}
}
public class User
{
public string Name { get; set; }
public string Email { get; set; }
public int Age { get; set; }
public string Sex { get; set; }
//解构函数
public void Deconstruct(out string name,out string email)
{
name = Name;
email = Email;
}
//结构函数重载
public void Deconstruct(out string name,out int age,out string email)
{
name = Name;
age = Age;
email = Email;
}
}
但是解构不支持参数一致的重载
哪怕参数类型不一致
感觉像参数类型推断错误,但是,,
所以解构函数并不参数数量相同的重载,哪怕参数类型不一致
C#7.0中的解构功能---Deconstruct的更多相关文章
- 【JS】325- 深度理解ES6中的解构赋值
点击上方"前端自习课"关注,学习起来~ 对象和数组时 Javascript 中最常用的两种数据结构,由于 JSON 数据格式的普及,二者已经成为 Javascript 语言中特别重 ...
- WCF学习之旅—WCF4.0中的简化配置功能(十五)
六 WCF4.0中的简化配置功能 WCF4.0为了简化服务配置,提供了默认的终结点.绑定和服务行为.也就是说,在开发WCF服务程序的时候,即使我们不提供显示的 服务终结点,WCF框架也能为我们的服务提 ...
- ES6中的解构
数组中的解构: 输出 : 白板 幺鸡 二条 对象的解构: 输出: 老王 12 数组的结构用[];对象的解构用{}:一定要区分它是数组还是解构. 区分方法:看 它是在赋值还是在拿值,等号左边,都为解构, ...
- ES6中的解构赋值
在解释什么是解构赋值前,我们先来看一下, ES5 中对变量的声明和赋值. var str = 'hello word'; 左边一个变量名,右边可以是字符串,数组或对象. ES6 中增加了一种更为便捷的 ...
- ES2015中的解构赋值
ES2015中允许按照一定的模式,从数组和对象中提取值,对变量进行赋值,被称为”解构(Destructering)“. 以前,为变量赋值,只能指定值. /** * 以前,为变量赋值,只能直接指定值 * ...
- ASP.Net4.0中新增23项功能
这篇文章介绍Visual Studio 2010 (ASP.Net 4.0)的新功能. 1.代码片段(Code Snippets): 代码段是预先开发的代码模板,可以节省我们对有关语法思考的时间.在V ...
- 用ASP.NET Core 1.0中实现邮件发送功能
准备将一些项目迁移到 asp.net core 先从封装类库入手,在遇到邮件发送类时发现在 asp.net core 1.0中并示提供SMTP相关类库,于是网上一搜发现了MailKit 好东西一定要试 ...
- JS中的解构
先看看数组解构: function fn(){ return [1,2,3]; } var [a,b,c] = fn(); console.log(a,b,c); // 1 2 3 var [d,,f ...
- JavaScript 中对象解构时指定默认值
待解构字段为原始值 正常情况下, const obj = { a: 1, b: 2, }; const { a, b } = obj; console.log(a, b); // 1 2 当被解构字段 ...
随机推荐
- 说说不知道的Golang中参数传递
本文由云+社区发表 导言 几乎每一个C++开发人员,都被面试过有关于函数参数是值传递还是引用传递的问题,其实不止于C++,任何一个语言中,我们都需要关心函数在参数传递时的行为.在golang中存在着m ...
- Mysql中Count函数的正确使用
备注: 直接使用Count(*)或Count(1)这些大家基本都会,主要是Count函数还可以加满足表达式的统计:express 关于Count函数表达式的用法,目前个人只知道2种: a:使用:Cou ...
- VS Code调试.Net Core版Hello World
安装C#插件 下载安装插件,地址:https://marketplace.visualstudio.com/items?itemName=ms-vscode.csharp 安装插件之后重新启动VS C ...
- C#___.net经典题
1 请你说说 .NET 中类和结构的区别? 答:结构和类具有大体的语法,但是结构受到的限制比类要多.结构不能申明有默认的构造函数,为结构的副本是又编译器创建 和销毁的,所以不需要默认的构造函数和 ...
- 结合JDK源码看设计模式——建造者模式
概念: 将一个复杂对象的构建与它的表示分离.使得同样构建过程可以创建不同表示适用场景: 一个对象有很多属性的情况下 想把复杂的对象创建和使用分离 优点: 封装性好,扩展性好 详解: 工厂模式注重把这个 ...
- Spring webflux
Spring-webflux Spring 5.0 Spring-webflux 是一个全新的非堵塞的函数式 Reactive Web 框架,可以用来构建异步的.非堵塞的.事件驱动的服务. sprin ...
- 【代码笔记】Web-CSS-CSS Table(表格)
一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- Python:运算类内建函数列举
1. divmod() python3.x版本中,整除运算用 “//”,取余可以用 “%”,在某些问题中要同时得到商和余数就需要两步运算,而使用divmod函数可以同时得到商和余数: 函数有两个参数d ...
- c/c++ 多线程 层级锁
多线程 层级锁 当要同时操作2个对象时,就需要同时锁定这2个对象,而不是先锁定一个,然后再锁定另一个.同时锁定多个对象的方法:std::lock(对象1.锁,对象2.锁...) 但是,有的时候,并不能 ...
- SQLServer之创建存储过程
创建存储过程注意事项 在 SQL Server. Azure SQL Database.Azure SQL 数据仓库和并行数据库中创建 Transact-SQL 或公共语言运行时 (CLR) 存储过程 ...