C#7.0"解构主义者"

Dav*_*ant 12 c# c#-7.0

我正在阅读有关C#7.0新内容的内容,至少从给出的示例中我不能理解,"解构器"的用法是什么.

它只是语法糖吗?

如果有人可以对此有所了解,那就太好了.

Mic*_*ael 18

它是新元组语法的一部分 - 它与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
   }
}
Run Code Online (Sandbox Code Playgroud)

用法:

var user = new User("foobaa", "foo", "baa");
Run Code Online (Sandbox Code Playgroud)

代替

var username = user.Username;
var firstName = user.FirstName;
var lastName = user.LastName;
Run Code Online (Sandbox Code Playgroud)

要么

string username, firstName, lastName;
user.Deconstruct(out username, out firstName, out lastName);
Run Code Online (Sandbox Code Playgroud)

你可以写:

var (username, firstName, lastName) = user;

var fullName = $"{firstName} {lastName}";
Run Code Online (Sandbox Code Playgroud)

更新


它可能用于的另一个例子,这只是推测,我没有尝试过这个,与模式匹配一​​起.

var users = new Dictionary<string, User>
{
    {"john", new User("jom", "John", "Malkovich") }
}
Run Code Online (Sandbox Code Playgroud)

C#6

User user;
users.TryGetValue("john", out user);
Run Code Online (Sandbox Code Playgroud)

C#7模式匹配

users.TryGetValue("john", out User user);
Run Code Online (Sandbox Code Playgroud)

C#7解构

users.TryGetValue("john", out (username, firstname, lastname));    
Run Code Online (Sandbox Code Playgroud)

  • 我也只是在阅读这个,并且有点不确定它的价值.我不怀疑可能有价值我没有看到,但希望看到更好的例子.我见过的例子已经从对象中解构了公共属性,事实上,那些正常感兴趣的值应该是公共属性.我没有看到值,甚至认为它是"语法糖",添加一行代码来声明和提取局部变量,而不是简单地使用对象的公共属性. (2认同)