簡體   English   中英

C# 7.0 “解構器”

[英]C# 7.0 “deconstructor”

我正在閱讀有關C# 7.0 的新內容,但我無法理解,至少從給出的示例來看,“解構器”的用法是什么。

它只是語法糖嗎?

如果有人可以對此有所了解,那就太好了。

它是新元組語法的一部分 - 與 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM