2010-10-06 15 views
7

Nigdy dotąd nie kwestionowałem tego. Mam model wejściowy z wielu dziedzin, chciałem przedstawić nazwiska ciągów o właściwościach poprzez model wejściowego tak, że mój Siatka może ich używać:Dlaczego klasa nie może mieć właściwości stałej lub stałej i właściwości instancji o tej samej nazwie?

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

    public const string Code = "Code"; 
} 

Oczywiście, to daje błąd:

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

Dlaczego CLR nie poradzi sobie z dwoma właściwościami o tej samej nazwie, które w moich oczach są osobne?

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

Mam teraz tylko za pomocą klasy dziecko nazwie Fields w moim wejść teraz, więc mogę używać SomeGridRow.Fields.Code. Jest trochę brudny, ale działa.

Odpowiedz

7

Ponieważ można również uzyskać dostęp do statycznych (lub non-instancji w tym przypadku) właściwości w taki sam sposób (wewnątrz tej samej klasy), a byłoby to nieco mylące, na przykład:

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

ponieważ zarówno to:

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

I tak:

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

są ważne sposoby uzyskania dostępu do właściwości, st atic lub nie. Nie odpowiada na pytanie "dlaczego nie mogę?" pytanie, ale więcej z tego, dlaczego nie jest dozwolone ... byłoby to zdecydowanie zbyt wieloznaczne IMO.

+0

Aye, ja sup stwarzają to oczywiste, gdy tak się pisze. Zawsze brałem członków statycznych za pewnik, jako dostęp do nich przy użyciu ich rzeczywistej nazwy klasy. Część standardów kodowania, nad którymi pracuję. – GenericTypeTea

+1

@GenericTypeTea - I to jest doskonały standard, w klasie jest miejsce, w którym jest to najbardziej dwuznaczne, być może nigdy nie powinno być dozwolone w ten sposób ... ale myślę, że sposób, w jaki to się skończyło, jest prawdopodobnie najmniej zagmatwanym kompromisem. –

+0

Zgadzam się. To kolejny przypadek jednego rozmiaru nie pasuje do wszystkich ... To naprawdę nie jest poważny problem. Po prostu jestem wybredna. Po prostu odkładam zagnieżdżone klasy. – GenericTypeTea

3

Prawdopodobnie mógł, ale projektanci C# chciał uniknąć niejasności, które mogą pochodzić z takiego użycia (nadużyć?) Funkcji językowych.

Taki kod będzie skończyć się mylące i niejednoznaczne z użytkownikami (nie chcę instancję lub statyczne wywołanie metody ?, Który z nich ma rację?).

+0

Standardy, które stosuję, zawsze nakazują, aby do statycznych członków odwoływały się ich statyczne nazwy To znaczy, że 'Foo' zawsze będzie' TheStaticClass.Foo', więc niejednoznaczność nie jest problemem, który mógłby wpłynąć na mnie To szkoda naprawdę! Wolałbym mieć potencjalną (ale kontrolowaną) niejednoznaczność zamiast klas zagnieżdżonych – GenericTypeTea

+0

@GenericTypeTea - gdyby tylko MS napisało C# dla ciebie i tylko ciebie;) – Oded

+0

Cóż, powinny one ... Visual Studios 2010 GenericTypeTea edycja! Kupiłbym je :) – GenericTypeTea

1

Oprócz punktów już dokonanych o dwuznaczności, chciałbym powiedzieć, że nazewnictwo należy relooked w takim przypadku.

Jeśli dwa zmienne/pola mające dokładnie taką samą nazwę w tej samej klasie kontekst t j ale różne wartości dla mnie brzmi to bardziej jak kwestii nazewnictwa.

Jeśli są dokładnie takie same, nie potrzebujesz 2 pól.

Jeśli są nieco inne, powinieneś mieć dokładniejsze nazwy.

+0

instantiatedClass.Code == 'Aktualna wartość'. TheClass.Code == 'Nazwa pola' do przekazania do źródła danych kolumny siatki. Nie podobają mi się wartości ciągów w widokach. Jedyną alternatywą jest użycie wyrażeń Lambda i użycie odbicia, aby uzyskać nazwę MethodName. – GenericTypeTea

+0

@GenericTypeTea - może to po prostu mój sposób robienia tego, ale TheClass.Code do mnie wolałby być bardziej dokładny jak TheClass.CodeColumnName, ponieważ jest to nazwa kolumny i nie należy go mylić z theObject.Code - co oznacza wartość w kolumnie kodu. W tym przypadku uważam, że obie te zmienne są całkowicie różne i dlatego mają różne nazwy. Przynajmniej dla mnie, posiadanie "kodu" jako nazwy dla nich obojga jest mylące. Obawiam się, że nie znam linku między nazwami i jak używasz ich w swoich lambdach ... – InSane

0

W niektórych innych językach o podobnej składni można uzyskać dostęp do statycznego elementu przez instancję. Możesz więc uzyskać dostęp zarówno do string.Empty, jak i "abc".Empty.

C# nie pozwala na to (chociaż robi coś w rodzaju klasy lub klasy pochodnej, ponieważ można pominąć nazwę klasy dla statycznego elementu i można pominąć this dla członka instancji), przede wszystkim w celu uniknięcia zamieszanie (uważam, że jest to bardziej przydatne niż zamieszanie tbh, ale to tylko ja, lubię przełączać się przez zbyt, więc co wiem).

Po wprowadziły surowsze reguły pozwalają na mniej dwuznaczności, byłoby odwrotne aby umożliwić nową regułę luźniejsze z tyłu to, że pozwolił na więcej. Zastanów się, ilu "dlaczego muszę używać this z właściwością X, ale nie właściwością Y?"pytania SO byłyby dopuszczalne, gdyby było dozwolone (musielibyśmy wymusić this, gdyby właściwość X była jasna, rozumiemy, że chodzi o członka instancji).

Powiązane problemy