Что бы вы не делали struct
с. Особенно , если они изменчивы!
Просто используйте свойства - они обычно предпочтительнее полей (особенно если вы собираетесь использовать интерфейсные системы, которые, скажем, TypeDescriptor
для получения информации о компонентах - Asp.Net MVC делает это).
Мое начальное правило заключается в том, что если он будет публичным или защищенным (в большинстве случаев), я буду использовать свойство. Если он защищенный или частный и неизменный , я рассмотрю использование поля только для чтения. Однако из этого правила всегда есть исключения, это всего лишь моя собственная отправная точка. Я редко когда-либо буду использовать открытое поле, за исключением вспомогательных классов для юнит-тестов.
Вопрос только для чтения - это другой вопрос, и реально его можно решить, только если вы действительно используете свойства.
Я бы использовал интерфейсы только для чтения:
public interface IMyData
{
int Value { get; }
}
И тогда ваши классы можно будет читать / записывать, если они вам нужны:
public class MyData : IMyData
{
public int Value { get; set; }
}
Интерфейс реализован - код, который использует и понимает MyData
(т. Е. Ваш производитель) может писать в него, но код, который требуется только для чтения, использует только интерфейс. Использование такой абстракции также дает дополнительное преимущество, позволяя вашему потребительскому коду использовать ваши данные в любой форме. Например. Вы можете добавить реализации интерфейса к типам сущностей, сгенерированным EF, если вы выбрали ORM.
Имейте в виду, однако, что вы не всегда можете принудительно применять только чтение для всех - особенно если вы собираетесь использовать такие типы, как универсальные словари и т. Д.
Для объектов, которые действительно всегда должны быть неизменными после построения, используйте конструкторы и скройте сеттер. Итак, снова класс MyData
:
public int Value { get; private set; }
public MyData(int value){
Value = value;
}
Конечно, вы также можете использовать для этого поле только для чтения (но ни один из подходов на самом деле не помешает кому-то, кто действительно хочет изменить ваш объект, сделать это, поскольку оба подхода могут быть нивелированы отражением).