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
我正在阅读有关 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