Как правильно реализовать собственное статическое пустое или нулевое поле - PullRequest
5 голосов
/ 31 июля 2009

У меня есть класс, этот класс может быть пустым. Этот класс имеет только открытые свойства типа String. Когда этот класс находится в пустом состоянии, это означает, что все свойства имеют значение String.Empty.

1) С открытым статическим полем свойства Class.Empty могут быть изменены.

2) Я не вижу, чтобы общедоступное статическое свойство getter должно было бы каждый раз возвращать новый пустой объект (все поля должны быть пустыми вручную ). Я считаю это плохой практикой.

3) Альтернативным решением является реализация собственного класса. IsNullOrEmpty (Class obj) .

4) A нестатическое публичное логическое свойство obj. IsEmpty .

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

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

1 Ответ

9 голосов
/ 31 июля 2009

1 и 2 конфликт, в основном.

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

Причина, по которой string.Empty в порядке, заключается именно в том, что string является неизменным.

Может ли ваш тип иметь быть изменяемым?

РЕДАКТИРОВАТЬ: Исходя из вашего комментария, кажется, что свойства не должны иметь сеттеры вообще. Вместо этого значения должны быть переданы в конструктор и сохранены в полях только для чтения.

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

private static readonly MyType empty = new MyType("", ""); // Or whatever
public static MyType Empty { get { return empty; } }

или

public static readonly MyType Empty = new MyType("", "");

Вам не нужно беспокоиться о том, чтобы кто-то устанавливал какие-либо свойства, потому что у вас нет сеттеров ...

...