2010-10-06 3 views
7

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

public class SomeGridRow 
{ 
    public string Code { get;set; } 
    public string Description { get;set; } 

    public const string Code = "Code"; 
} 

Очевидно, что это дает ошибку:

The type 'SomeGridRow' already contains a definition for 'Code'

Почему CLR не справляется с двумя свойствами одного и того же имени, которые на мой взгляд являются отдельными?

string code = gridRow.Code;   // Actual member from instantiated class 
string codeField = SomeGridRow.Code; // Static/Const 

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

ответ

7

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

public class SomeGridRow 
{ 
    public string Code { get;set; } 
    public const string Code = "Code"; 
    public void MyMethod() { 
    var thing = Code; //what would this reference? 
    } 
} 

так как это:

public class SomeGridRow 
{ 
    public string Code { get;set; } 
    public void MyMethod() { 
    var thing = Code; //what would this reference? 
    } 
} 

И это:

public class SomeGridRow 
{ 
    public const string Code = "Code"; 
    public void MyMethod() { 
    var thing = Code; //what would this reference? 
    } 
} 

являются допустимыми способами доступа к свойствам, ул атичный или нет. Он не отвечает: «Почему я не могу?» вопрос, но больше того, почему это не допускается ... это было бы слишком неоднозначным ИМО.

+0

Да, я Поза это очевидно, когда это прописано. Я всегда принимал статические члены как само собой разумеющееся как доступ, используя их фактическое имя класса. Часть стандартов кодирования, над которыми я работаю. – GenericTypeTea

+1

@GenericTypeTea - И это отличный стандарт, внутри класса, где он является самым двусмысленным, я думаю, возможно, его никогда не разрешали таким образом ... но я думаю, что так оно и закончилось, вероятно, является наименее запутанным компромиссом. –

+0

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

3

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

Такой код окажется запутанным и неоднозначным для пользователей (мне нужен экземпляр или вызов статического метода?) Какой из них прав?).

+0

Стандарты, к которым я придерживаюсь, всегда определяют, что статические члены должны ссылаться на их статическое имя Т.е. 'Foo' всегда будет' TheStaticClass.Foo'. Поэтому неоднозначность не является проблемой, которая повлияла бы на меня. Это позор действительно! Я бы предпочел иметь потенциальную (но контролируемую) двусмысленность вместо вложенных классов. – GenericTypeTea

+0

@GenericTypeTea - если только MS написала C# для вас и только вы;) – Oded

+0

Ну, они должны. Visual Studios 2010 GenericTypeTea edition! Я бы купил его :) – GenericTypeTea

1

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

Если две переменные/поля, имеющие одно и то же имя в одном контексте, класс i.e, но разные значения, скорее напоминают проблему с именами.

Если они точно такие же, вам не нужны 2 поля.

Если они немного разные, у вас должны быть более точные имена.

+0

instantiatedClass.Code == 'Фактическое значение'. TheClass.Code == 'Имя поля', которое нужно передать в источник данных столбца сетки. Мне не нравятся значения строк в представлениях. Единственная альтернатива - использовать выражения лямбда и использовать отражение для получения MethodName. – GenericTypeTea

+0

@GenericTypeTea - возможно, это просто мой способ сделать это, но TheClass.Code для меня скорее будет более точным, чем имя TheClass.CodeColumnName, поскольку оно означает имя столбца и его не следует путать с theObject.Code - который обозначает значение в столбце кода. В этом случае я бы рассматривал обе эти переменные совершенно разные и, следовательно, имел разные имена. По крайней мере, для меня, имея «Код» как имя для них, оба вводят в заблуждение. Я боюсь, что я совсем не получаю связь между именами и тем, как вы их используете в своих лямбдах ... – InSane

0

В некоторых других языках с аналогичным синтаксисом можно получить доступ к статическому элементу через экземпляр. Таким образом, вы можете получить доступ как к string.Empty, так и к "abc".Empty.

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

Введя более строгое правило, позволяющее допускать меньшую двусмысленность, было бы контрпродуктивным разрешить новое правило свободного доступа на оборотной стороне, которое допускало больше. Подумайте, сколько «почему я должен использовать this с имуществом X, но не свойство Y?«вопросы, которые были бы у SO, если бы это было разрешено (нам нужно было бы заставить , чтобы свойство X было понятным, мы имели в виду член экземпляра).

Смежные вопросы