Является ли плохой практикой называть свойство / элемент таким же, как объявленный тип в C #?


25

Например, такой класс:

class Dog { } //never mind that there's nothing in it...

а затем свойство как:

Dog Dog { get; set; }

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

Dog DogObject { get; set; }

Любые мысли о том, как назвать их лучше?


2
Это требование, о котором вам говорили, кажется мертвым, возможно, из-за чрезмерного применения хорошего руководства (не просто используйте имя типа, когда есть лучшее имя).

2
Это даже не скомпилируется в C #, поскольку имена членов не могут совпадать с типом включения.
Ли

3
@ Ли: Я думаю, что контекст заключается в том, что это свойство другого типа. Например, Personкласс, содержащий Dogсвойство с именемDog
goric

3
Я имею в виду, если она действительно собака, маркируйте ее таковой.
Томас Эдинг

1
Подсветка синтаксиса в вашей среде IDE должна различать тип и свойство. Когда вы не используете IDE, вы всегда можете посмотреть на контекст.
Cyanfish

Ответы:


22

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

Dog = new Dog();

Какой конструктор типа? Какой объект? Не смущен? Хорошо, как насчет

Dog = Dog.Create()?

Какой объект? Какой метод статической фабрики для типа? Все еще не смущен? Я так не думаю.

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

Dog = new Some.Namespace.Dog();

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

dog = new Dog();

7
+1. И альтернативы все хуже: «TheDog», «AnyDog», «MyDog» и т. Д. Когда нечего добавить, лучше ничего не добавлять.
Кевин Клайн

Я полагаю, что второй может запутаться, если по какой-то причине Dogбудет вызван метод экземпляра Create, но в этот момент вы погрузитесь в довольно ужасные методы кодирования.
KDiTraglia

40

Мало того, что это разумная практика, язык был специально разработан для этого. Найдите в спецификации C # «Color Color» правила и обоснование и посмотрите

http://blogs.msdn.com/b/ericlippert/archive/2009/07/06/color-color.aspx

для некоторых интересных угловых случаев, которые возникают из этого решения.

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


Если тип свойства является типом, экземпляры которого не имеют идентичности (например Color), такое использование кажется разумным. Мне не очень нравится, хотя, с изменчивыми или IDisposableтипами. Относится ли «элемент управления Font» к тем аспектам состояния, которые инкапсулированы свойством, или к экземпляру, Fontидентифицированному получателем свойства?
суперкат

7

Это прекрасно, Dogи это то, что Microsoft рекомендует в Руководстве по именованию :

РАССМОТРЕТЬ присвоение свойству того же имени, что и его тип.

Например, следующее свойство правильно получает и устанавливает значение перечисления с именем Color, поэтому свойство называется Color.

И вот пример, который они используют в приведенном выше руководстве:

public enum Color {...}
public class Control {
    public Color Color { get {...} set {...} }
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.