这是新元组语法的一部分——与Tuple<>类无关,而是来自函数式编程。
考虑以下类:
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 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);
}
从我有限的经验来看,临时元组是有帮助的,并且在一定程度上有其用途。然后就存在一个界限,需要使用更正式的类定义,支持一个或几个解构用例。
等等。
希望对你有所帮助。