C# 7.0 "deconstructor"

C# 7.0 "deconstructor"

我正在阅读有关 C# 7.0 new stuff 的内容,但我无法理解,至少从给出的示例来看,"deconstructor".

的用法是什么

只是语法糖吗?

如果有人能阐明它,那就太好了。

它是新元组语法的一部分——与 Tuple<> classes 无关——而是从函数式编程中提取的。

考虑这个 class:

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));    

如果没记错的话,它也与 ValueTuple<...> 相吻合,临时元组可以而且经常这样做,而且从字面上看,所有......时间都被解构了。也就是说,

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

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

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);
}

从我对这些小动物的有限经验来看,临时元组在一定程度上是有帮助的,并且有它们的用途。然后在该定义和更正式的 class 定义之间有一条界线,支持一个或几个解构用例。

以此类推

HTH