[英]C# 7.0 “deconstructor”
它是新元組語法的一部分 - 與 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<...>
重合,ad hoc tuples,它可以並且經常這樣做,也可以解構,從字面上看,所有...時間。 也就是說,
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.