2009-07-08 8 views
59

Ich habe manchmal gesehen Code wie folgt geschrieben:Sollte eine Eigenschaft denselben Namen wie ihr Typ haben?

public class B1 
{ 
} 

public class B2 
{ 
    private B1 b1; 

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

heißt Klasse B2 hat eine Eigenschaft namens „B1“, die ebenfalls vom Typ „B1“ ist.

Mein Bauchgefühl sagt mir, das ist keine gute Idee, aber gibt es irgendwelche technischen Gründe, warum Sie vermeiden sollten, einer Eigenschaft den gleichen Namen wie ihrer Klasse zu geben?

(Ich verwende .net 2.0, falls das wichtig ist).

+0

Ich glaube, dass die .NET-Framework-Design-Richtlinien auch diese Namenskonvention empfiehlt. – NotDan

+0

welche Benennungskonvention - die gleiche Sache nennen, oder den Fall für Differenzierung ändern? – niico

Antwort

55

Es ist in Ordnung. Das bekannteste Beispiel ist hier

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

Es gibt seltene Ausgaben (Ecke Fälle), die hierher kommen, aber nicht genug, um zu gewährleisten, dieses Gerät zu vermeiden. Ehrlich gesagt finde ich dieses Gerät sehr nützlich. Ich würde nicht genießen nicht die folgenden in der Lage zu tun:

class Ticker { ... } 


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

Ich will nicht Ticker StockTicker oder Ticker ThisTicker usw.

+3

Was sind die Eckkästen? –

+10

'Klasse A {öffentliche statische void Methode (int i) {} public void Methode (Objekt o) {}}' und 'Klasse B {A A {get; einstellen; } public B() {A = neu A(); A.Methode (0); }} '. Ruft 'A.Method' die statische Methode' Methode' auf oder ruft sie die Instanzmethode 'Methode' auf? (In C# stellt es sich heraus, dass es die statische Methode aufruft. Wenn Sie jedoch die "0" in "A.Method (0)" durch "Hallo, Welt!" Ersetzen, wird die Instanzmethode aufgerufen Intellisense hebt das nicht auf und hebt das 'A' in' A.Method ("Hello, world!") 'Blau hervor, als ob es die statische Methode wäre.) – jason

+2

Und das soll nur darauf hinweisen, dass es sein kann (Seltene) Fälle, in denen die Absicht des Codes, der dieses Muster verwendet, nicht kristallklar ist (es gibt natürlich immer eine eindeutige Interpretation basierend auf der Sprachspezifikation). – jason

10

Gerade heute hat Eric über das Problem 'Color Color' gebloggt.

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

Persönlich würde ich es vermeiden, wenn möglich.

+3

Warum? Ich sehe keinen Schaden daran. –

+1

@StevenSudit IMO es fügt Komplexität für den Programmierer hinzu (schließlich müssen Sie diesen Artikel lesen, um zu verstehen, was vor sich geht), und wir Programmierer wissen, wie schlecht und fehleranfällig das ist. Ich würde es auch vermeiden. – MasterMastic

3

Es gibt kein spezifisches technisches Problem damit. Dies könnte die Lesbarkeit beeinträchtigen oder verbessern. In der Tat haben einige Microsoft-Bibliotheken diese Art von Eigenschaften (speziell mit enum Eigenschaften, dies macht normalerweise Sinn).

9

ich nur zu sagen zu haben, kann ein Nachteil denken. Wenn Sie so etwas wie dies tun wollte:

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(); 
     } 
} 

würden Sie müssen stattdessen verwenden:

MyNamespace.B1.MyFunc(); 

Ein gutes Beispiel hierfür ist die gemeinsame Nutzung in WinForms-Programmierung ist, wo die System.Windows. Die Forms.Cursor-Klasse überschneidet sich mit der System.Windows.Forms.Form.Cursor-Eigenschaft, sodass Ihre Formularereignisse unter Verwendung des vollständigen Namespace auf statische Member zugreifen müssen.

1

Es kann natürlich ein wenig verwirrend sein, wenn der Name einer Eigenschaft und der Typ identisch sind, aber ansonsten ist es kein Problem.

Wenn der Name sinnvoll ist, ist es normalerweise besser, den Namen und den Typ identisch zu machen. Wenn Sie sich einen besseren Namen vorstellen können, sollten Sie das natürlich verwenden, aber Sie sollten nicht versuchen, sich um jeden Preis einen Namen zu machen, nur um diese Situation zu vermeiden.

0

Ich gebe Dinge den gleichen Namen wie ihr Typ, außer für den Fall: meine Methoden und Eigenschaften sind "LowCase"; und ich hätte daher nicht das Problem, dass MiffTheFox hat.

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 
    } 
} 

für mich So ist m_b1 Mitgliederdaten, b1 eine Eigenschaft ist (oder eine lokale Variable oder Parameter) und B1 ist der Name der Klasse.

+3

Leider steht die Verwendung von Kleinbuchstaben für Eigenschaften und Methoden in direktem Konflikt mit den akzeptierten Benennungsrichtlinien für C# –

+0

Ja, sie sind minderwertige Richtlinien, IMO, nicht einverstanden? Warum sind sie entstanden? – ChrisW

2

Ein anderes Problem ist mit inneren Typen.

Ich laufe in diese ganze Zeit:

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; 
    } 
} 
+3

Deshalb pluralisiere ich meine enum Namen. Es gibt mehrere mögliche 'Marken' von Auto, aber dieses Auto hat nur ein' Make'. Es liest nicht immer das beste, aber ich schaue an ist, als das enum eine Liste von ist möglich 'Makes'. –

1

Dieses gemeinsame Muster einer der Gründe ist, warum ich this immer verwenden, wenn innerhalb einer Klasse zu einer Instanz Mitglied bezieht. z.B. immer

this.SomeMethod(this.SomeProperty); 

und nie

SomeMethod(SomeProperty); 

In den meisten Fällen gibt es keine tatsächliche Zweideutigkeit, aber ich finde es hilft, die Dinge zu klären. Außerdem wissen Sie nun, wo die Eigenschaft/Methode definiert ist.

15

Der Microsoft Naming Guideline for Members Zustand:

Betrachten wir eine Eigenschaft den gleichen Namen wie seine Art zu geben.

Wenn Sie eine Eigenschaft haben, die stark in eine Enumeration getippt wird, kann der Name der Eigenschaft mit dem Namen der Enumeration identisch sein. Wenn Sie beispielsweise eine Aufzählung mit dem Namen CacheLevel haben, kann eine Eigenschaft, die einen ihrer Werte zurückgibt, auch mit dem Namen CacheLevel lauten.

Obwohl ich zugeben, gibt es eine kleine Zweideutigkeit, ob sie dies nur für Enums oder für Eigenschaften im Allgemeinen empfehlen.

Verwandte Themen