首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C#7中编写自己的解构函数的合适用例是什么?

在C#7中编写自己的解构函数的合适用例是什么?
EN

Software Engineering用户
提问于 2017-05-13 22:13:16
回答 2查看 415关注 0票数 3

C# 7有一个很好的新语言特性: Deconstructor。例如,可以将其用于值元组。但是,我也可以为自己的类创建自己的解构函数。我为什么要这么做?我的类有属性。所以无论如何都可以访问个别的项目。

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2017-05-14 01:28:53

解构主义提供了相当简洁和清晰的传统选择,并提供了一个完全功能风格的编程支持。

考虑一下Microsoft的这个简单的单行解构函数示例:

代码语言:javascript
复制
var (first, middle, last) = LookupName(id1); 

要以传统的面向对象的方式做同样的事情,您必须编写如下代码:

代码语言:javascript
复制
class Name
{
    public string First { get; set; }
    public string Middle { get; set; }
    public string Last { get; set; }
}
代码语言:javascript
复制
var name = someObject.LookupName(id1);

var first = name.First;
var middle = name.Middle;
var last = name.Last;

即使您返回了一个元组,它仍然需要4行代码,并且您将失去属性名称映射:

代码语言:javascript
复制
var name = someObject.LookupName(id1);

var first = name.Item1;
var middle = name.Item2;
var last = name.Item3;
票数 5
EN

Software Engineering用户

发布于 2017-05-15 20:31:58

对于这个问题,“用例”是一个有点奇怪的说法。这不允许你做任何你以前做不到的事。在某些情况下更整洁。

我能想到的唯一主要的事情是,它提供了一些有限的编译时检查。例如,假设您有一个UsAddress类。您有第1行、第2行、城市、州和zip。您可以将其分解为变量var (line1, line2, city, state, zip) = ObtainAddress()。现在假设您想要添加第3行,这个点现在将是一个编译错误,因为它与解构函数不匹配,您可以在每个调用站点评估您需要对第3行做什么。另一种选择是:

代码语言:javascript
复制
var address = ObtainAddress();
var line1 = address.Line1;
// ...

在这种情况下,新字段不会出现编译错误。当然,这是否好,这是它自己的争论。

C# 6和7中的许多想法都在润色和缓解痛点,似乎很多人抱怨缺少对语言中元组的一流支持。所以它与其说是“用例”,不如说是语法糖。

票数 2
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/348920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档