Должно ли свойство иметь то же имя, что и его тип?



Я иногда видел код, написанный так :



public class B1
{
}

public class B2
{
private B1 b1;

public B1 B1
{
get { return b1; }
set { b1 = value; }
}
}


т. е. класс B2 имеет свойство с именем "B1", которое также имеет тип "B1".



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



(Я использую .net 2.0, если это имеет значение).

544   9  

9 ответов:

это нормально. Канонический пример здесь

public Background {
    public Color Color { get; set; }
}

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

class Ticker { ... }


public StockQuote {
    public Ticker Ticker { get; set; }
}

Я не хочу сказать Ticker StockTicker или Ticker ThisTicker etc.

The руководство по именованию Microsoft для членов состояние:

рассмотрите возможность присвоения свойству того же имени, что и его тип.

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

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

Я могу думать только об одном недостатке. Если вы хотите сделать что-то вроде этого:

public class B1
{
        public static void MyFunc(){ ; }
}

public class B2
{
        private B1 b1;

        public B1 B1
        {
                get { return b1; }
                set { b1 = value; }
        }

        public void Foo(){
                B1.MyFunc();
        }
}

вам придется вместо этого использовать:

MyNamespace.B1.MyFunc();

хорошим примером этого является общее использование в программировании Winforms, где система.Окна.Формы.Класс курсора перекрывается с системой.Окна.Формы.Форма.Свойство Cursor, поэтому события формы должны иметь доступ к статическим членам, используя полное пространство имен.

только сегодня Эрик написал в блоге о проблеме "цветного цвета".

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

лично я бы избегал этого, если это возможно.

нет никакой конкретной технической проблемы с ним. Это может повредить или улучшить читаемость. Фактически, некоторые библиотеки Microsoft имеют такие свойства (в частности, с enum свойства, это обычно имеет смысл).

еще один gotcha с внутренними типами.

я сталкиваюсь с этим все время:

public class Car {
    public enum Make {
        Chevy,
        Ford
    };

    // No good, need to pull Make out of the class or create
    // a name that isn't exactly what you want
    public Make Make {
        get; set;
    }
}

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

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

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

this.SomeMethod(this.SomeProperty);

и не

SomeMethod(SomeProperty);

в большинстве случаев нет никакой фактической двусмысленности, но я считаю, что это помогает прояснить ситуацию. Кроме того, теперь вы знаете, где определяется свойство/метод.

Я даю вещам то же имя, что и их тип, за исключением case: мои методы и свойства "строчные"; и поэтому у меня не было бы проблемы, которую имеет MiffTheFox.

public class B1
{
    public static void myFunc(){ ; }
}

public class B2
{
    private B1 m_b1;

    public B1 b1
    {
        get { return m_b1; }
        set { m_b1 = value; }
    }

    public void Foo()
    {
        B1.myFunc(); //this is Ok, no need to use namespace
    }
}

для меня m_b1 данные-члены, b1 - это свойство (или локальная переменная или параметр), и B1 - имя класса.

Comments

    Ничего не найдено.