Есть ли что-нибудь похожее на Java AutoValue в C#? - PullRequest
0 голосов
/ 11 июля 2020

Проработав некоторое время над проектом Java, а затем вернувшись к C#, я обнаружил, что мне действительно не хватает AutoValue. В частности, я хотел бы иметь возможность:

  • Создавать неизменяемый класс значений с минимальным шаблоном.
  • Автоматически обрабатывать такие вещи, как равенство и код ha sh.
  • В идеале, чтобы он автоматически генерировал построитель, чтобы обеспечить плавное построение и произвольную проверку, например, «если вы укажете параметр A, вы также должны указать B».
  • В том же духе, toBuilder () -style для создания глубокой копии существующего экземпляра при внесении некоторых изменений.

Все это было бы очень просто с AutoValue. Есть что-нибудь подобное? Я, конечно, мог бы реализовать все эти функции сам, но это много шаблонов, что усложняет обслуживание и повышает вероятность ошибок.

1 Ответ

1 голос
/ 12 июля 2020

Из того, что вы описали, кажется, что вам нужно будет подождать, пока C # 9 типы записей , чтобы получить то, что вы описали для java s AutoValues, т.е. в C # 9 вы должны иметь возможность объявить:

public data class Person
{
    public string FirstName { get; init; }
    public string LastName { get; init; }
}

Тогда вы получите:

Между тем (C # 8 и более ранние версии) вам нужно будет сделать часть этого вручную, ie

  • Объявите свойства вашего класса как только получить
  • Инициализировать все свойства через конструктор
  • Создайте свой собственный stati c factory / методы построения
  • Используйте инструменты генерации кода в IDE, например , для генерации элементов равенства

В стороне, я Если вы только что переключились с Java на C#, возможно, вы не знаете structs как типы значений для тривиальных «записей», которые из документации:

Структуры лучше всего подходят для очень маленьких структур данных, содержащих в основном данные, которые не предназначены для изменения после создания структуры.

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

Тем не менее, варианты использования для структур должны быть тщательно рассмотрены и обычно должны использоваться только для тривиальных неизменяемых записей или из соображений производительности при использовании в массивах.

...