C# 7.0 "deconstructor"

标签 c# c#-7.0

我正在阅读 C# 7.0 new stuff ,至少从给出的示例来看,我无法理解“解构函数”的用法。

它只是语法糖吗?

如果有人能阐明它,那就太好了。

最佳答案

它是新元组语法的一部分 - 与 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));    

关于C# 7.0 "deconstructor",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40906305/

相关文章:

c# - 使用 'not exists' 和 'group by' Linq 到对象?

c# - 为什么 ReSharper 认为 "thread.Name == null"总是错误的?

c# - 从 TabItem 获取并迭代控件?

c# - 将新元组转换为旧元组会产生编译错误

c# - 如何重命名返回的元组项目?

c# - 为什么不允许为方法声明空表达式体?

c# - 丢弃和不分配变量有什么区别?

c# - 从 C# 中的脚本语言获取表达式树

c# - 在 Sandbox 中一切正常,但我使用 PayPal Live 得到 IdentityException

c# - 有没有办法检查调用者是否丢弃了 out 参数?