2016-12-01 2 views
4

Я читаю около C# 7.0 new stuff, и я не могу понять, по крайней мере, из приведенного примера, что будет использовать для «деконструктора».C# 7.0 «deconstructor»

Это просто синтаксический сахар?

Если кто-то мог пролить свет на это, это было бы хорошо.

+2

Что неясно? Что касается синтаксического сахара: на нем ссылается ссылка: «Очевидно, вы можете вызвать метод Deconstruct, как и в C# 1.0. Однако C# 7.0 обеспечивает синтаксический сахар, который значительно упрощает вызов». –

+1

Не нужно беспокоиться об этом, это в значительной степени автоматическое. Вскоре после того, как вы начнете работать с новым синтаксисом кортежа, вы найдете применение для этого сахара. –

+1

Кажется, что в C# добавлен новый синтаксис только для контроля четности функции с другими языками, но добавление сомнительной ценности и отсутствие намерения сделать яснее. –

ответ

8

Это часть нового синтаксиса кортежа - который не имеет ничего общего с уроками 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}"; 

Update


Другой пример, который может быть использован для, и это только предположения, я не пробовал, это вместе с сопоставления с образцом.

var users = new Dictionary<string, User> 
{ 
    {"john", new User("jom", "John", "Malkovich") } 
} 

С # 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));  
+0

Значит, вы имеете в виду, что это просто синтаксический сахар? Я предполагаю, что если эта функция была введена на этом языке, это было связано с конкретной потребностью. Если я правильно понимаю вас, то нужно было бы получить доступ к нескольким свойствам экземпляра объекта одним выстрелом? –

+0

Возможно, это связано со старыми типами «Tuple». В зависимости от результата [этой проблемы] (https://github.com/dotnet/corefx/issues/13746) у 'Tuple', вероятно, будет' Deconstruct', поэтому вы сможете написать 'var (x , y) = Tuple.Create (10, 20); '. – svick

+2

Я также просто читал об этом и немного не уверен в его ценности. Я не сомневаюсь, что может быть ценность, которую я не вижу, но хотел бы увидеть лучшие примеры этого.Примеры, которые я видел, деконструировали публичные свойства объекта, и на самом деле эти ценности, представляющие интерес, должны быть общедоступными. Я не вижу значения или даже считаю его «синтаксическим сахаром», чтобы добавить строку кода, чтобы объявлять и извлекать локальные переменные, а не просто использовать общедоступные свойства объекта. – reads0520