Могу ли я избежать создания конструкторов, которые ТОЛЬКО создают экземпляры частных переменных на C #? [Дубликат]

Хотя верно, что запрос регулярных выражений для синтаксического анализа произвольного HTML похож на прошение начинающему писать операционную систему, иногда бывает целесообразно проанализировать ограниченный , известный набор HTML.

Если у вас есть небольшой набор HTML-страниц, которые вы хотите очистить данные, а затем вложить в базу данных, регулярные выражения могут работать нормально. Например, недавно я хотел получить имена, партии и округа австралийских федеральных представителей, которые я сошел с веб-сайта парламента. Это была ограниченная одноразовая работа.

Regexes отлично справились со мной и были очень быстрыми, чтобы настроить.

12
задан myfunnyfella 1 February 2017 в 08:26
поделиться

2 ответа

Способ сделать это - использовать кортеж и деконструкцию, чтобы разрешить несколько присвоений в одном выражении:

public class Person
{
    public string Name { get; }
    public int Age { get; }

    public Person(string name, int age) => (Name, Age) = (name, age);
}

Начиная с C # 7.1 (представленного с помощью Visual Studio 2017 Update 3), компилятор код теперь оптимизирует фактическую конструкцию и деконструкцию кортежа. Таким образом, этот подход не имеет накладных расходов на производительность по сравнению с назначением «longhand».

31
ответ дан David Arno 16 August 2018 в 00:41
поделиться
  • 1
    Ницца, не подумал о том, чтобы разобраться с этим ... – Jon Skeet 1 February 2017 в 09:48
  • 2
    Это зло. Я использую C # 7.1, и я просто не могу этого избежать. – Panagiotis Kanavos 15 September 2017 в 11:54
  • 3
    @PanagiotisKanavos, каким образом это зло? Как будто C # 7.1, я начал использовать это, поскольку это похоже на опрятное решение для меня. – David Arno 15 September 2017 в 12:05
  • 4
    @DavidArno Он, вероятно, думал, что это было немного злобно, учитывая, сколько циклов процессора используется под капотом только ради элегантного синтаксиса. Я решил создать небольшое приложение, чтобы сравнить бок о бок, а синтаксис кортежа выше удвоил количество времени, необходимое для создания нового объекта. ИМХО, что действительно впечатляет и говорит о том, насколько эффективны кортежи. Для 99,999% разработчиков я бы сказал, что разница в производительности здесь несущественна. – pbarranis 7 November 2017 в 16:47

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

Я имею в виду, что вы могли использовать кортежи, но я настоятельно рекомендую против этого:

// DO NOT USE THIS CODE - IT'S JUST TO DEMONSTRATE THE FEASIBILITY
public class Person
{
     private readonly (string name, int age) tuple;

     public string Name => tuple.name;
     public int Age => tuple.age;

     public Person(string name, int age) => tuple = (name, age);
}

Это работает, потому что вы Теперь у нас появилось только одно утверждение (tuple = (name, age);). Но вы, конечно, не должны изменять свои поля так, чтобы вы могли использовать конструктор с выраженным выражением.

(Как показал Дэвид, вы можете построить кортеж, а затем деконструировать его в автоматические реквизиты только для чтения напрямую, это немного приятнее, но это все равно не стоит делать IMO.)

13
ответ дан Jon Skeet 16 August 2018 в 00:41
поделиться
  • 1
    для того, чтобы этот пример работал, вам также необходимо установить этот пакет System.ValueTuple: install-package System.ValueTuple – Sirwan Afifi 15 March 2017 в 20:25
Другие вопросы по тегам:

Похожие вопросы: