C#7.0" deconstructor"

时间:2016-12-01 08:59:40

标签: c# c#-7.0

我正在阅读关于C# 7.0 new stuff的内容,至少从给出的例子来看,我无法理解," deconstructor"的用法是什么。

它只是语法糖吗?

如果有人可以对此有所了解,那就太好了。

2 个答案:

答案 0 :(得分:15)

它是新元组语法的一部分 - 与元组<>无关。类 - 但是从函数式编程中获取。

考虑这个课程:

public class User
{
   public string Username { get; }
   public string FirstName { get; }
   public string LastName { get; }

   public User(string username, string firstName, string lastName)
   {
       // initialize properties
   }

   public void Deconstruct(out string username, out string firstName, out string lastName)
   {
       // initialize out parameters
   }
}

用法:

var user = new User("foobaa", "foo", "baa");

而不是

var username = user.Username;
var firstName = user.FirstName;
var lastName = user.LastName;

string username, firstName, lastName;
user.Deconstruct(out username, out firstName, out lastName);

你可以写:

var (username, firstName, lastName) = user;

var fullName = $"{firstName} {lastName}";

<强>更新

它可能用于的另一个例子,这只是推测,我没有尝试过这个,与模式匹配一​​起。

var users = new Dictionary<string, User>
{
    {"john", new User("jom", "John", "Malkovich") }
}

C#6

User user;
users.TryGetValue("john", out user);

C#7模式匹配

users.TryGetValue("john", out User user);

C#7解构

users.TryGetValue("john", out (username, firstname, lastname));    

答案 1 :(得分:-1)

如果没记错的话,它也与 ValueTuple<...> 重合,特别元组,它可以并且经常被解构,确切地说,所有......时间。也就是说,

var tuple = (1, true, "string"); // to bind them all
var (one, flag, s) = tuple;

或者如果我们将其形式化为适当的类:

class Data
{
  public int Value { get; set; }

  public bool Flag { get; set; }

  public string Text { get; set; }

  public void Deconstruct(out int value, out bool flag, out string text) =>
    (value, flag, text) = (this.Value, this.Flag, this.Text);
}

根据我对这些小动物的有限经验,临时元组在某种程度上很有帮助,并且有其用途。然后,在此与更正式的类定义之间存在界限,支持一个或几个解构用例。

等等。

HTH