我正在阅读关于C# 7.0 new stuff的内容,至少从给出的例子来看,我无法理解," deconstructor"的用法是什么。
它只是语法糖吗?
如果有人可以对此有所了解,那就太好了。
答案 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