Ich habe manchmal Code gesehen, der so geschrieben wurde:
public class B1
{
}
public class B2
{
private B1 b1;
public B1 B1
{
get { return b1; }
set { b1 = value; }
}
}
dh Klasse B2 hat eine Eigenschaft mit dem Namen "B1", die ebenfalls vom Typ "B1" ist.
Mein Bauchgefühl sagt mir, dass dies keine gute Idee ist, aber gibt es technische Gründe, warum Sie vermeiden sollten, einer Immobilie den gleichen Namen wie ihrer Klasse zu geben?
(Ich benutze .net 2.0, falls das wichtig ist).
c#
.net
naming-conventions
Moe Sisko
quelle
quelle
Antworten:
Das ist gut. Das kanonische Beispiel hier ist
public Background { public Color Color { get; set; } }
Es gibt seltene Probleme (Eckfälle), die hier auftreten, aber nicht genug, um die Vermeidung dieses Geräts zu rechtfertigen. Ehrlich gesagt finde ich dieses Gerät sehr nützlich. Ich würde es nicht genießen, wenn ich nicht in der Lage wäre, Folgendes zu tun:
class Ticker { ... } public StockQuote { public Ticker Ticker { get; set; } }
Ich möchte nicht sagen müssen
Ticker StockTicker
oderTicker ThisTicker
etc.quelle
class A { public static void Method(int i) { } public void Method(object o) { } }
undclass B { A A { get; set; } public B() { A = new A(); A.Method(0); } }
. Wird denA.Method
Aufruf der statischen Methode mit dem NamenMethod
oder ist es die Instanz Methode mit dem Namen aufrufenMethod
? (In C # es stellt sich heraus , dass es die statische Methode aufrufen. Wenn Sie jedoch das Ersetzen0
inA.Method(0)
durch"Hello, world!"
sie die Instanz - Methode aufrufen wird. Beachten Sie, dass Intellisense dies nicht abholen und wird das HighlightA
inA.Method("Hello, world!")
blau , als ob es die statische waren Methode.)A = new A()
, tun Sie es einfacha = new A()
. Es ist keine Belastung mehr, aber viel klarer. Ihr Randfall betrifft Objekte, keine Eigenschaften. Sie haben jedoch die Frage zu Objekten geschlossen. In VB unterscheiden Intellisense und Umbenennung nicht zwischen Klassen- und Instanzreferenzen, wenn Objekt und Klasse denselben Namen haben. Das Umbenennen von Eigenschaften mit demselben Namen wie der Typ ist jedoch kein Problem.A
inA=new A()
zua
beispielsweiseA.Method("Hello, world!")
wird nicht umbenannt werden, ein zu verursachenNullReferenceException
zur Laufzeit. Ein weiterer Grund, Objekte nicht mit der Klasse zu benennen, aber dies ist kein Problem mit Eigenschaften! Das Umbenennen der Eigenschaft mit demselben Namen wie der Rückgabetyp ist kein Problem.In der Microsoft-Namensrichtlinie für Mitglieder heißt es :
Obwohl ich zugebe, dass es ein wenig Unklarheit gibt, ob sie dies nur für Enums oder für Eigenschaften im Allgemeinen empfehlen.
quelle
Ich kann mir nur einen Nachteil vorstellen. Wenn Sie so etwas machen wollten:
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(); } }
Sie müssten stattdessen verwenden:
Ein gutes Beispiel hierfür ist die allgemeine Verwendung in der Winforms-Programmierung, bei der sich die System.Windows.Forms.Cursor-Klasse mit der System.Windows.Forms.Form.Cursor-Eigenschaft überschneidet, sodass Ihre Formularereignisse über den vollständigen Namespace auf statische Elemente zugreifen müssen .
quelle
Erst heute hat Eric über das Problem 'Farbe Farbe' gebloggt.
http://blogs.msdn.com/ericlippert/archive/2009/07/06/color-color.aspx
Persönlich würde ich es wenn möglich vermeiden.
quelle
static M
und (Instanz) deklariert hatM
. Die Diskussion vonColor Color
nur zeigt, dass die KombinationColor Color
mitstatic M
undM
das Problem verschlimmert. Also mach nicht die ursprüngliche Idiotie.Ein anderes Gotcha ist mit inneren Typen.
Ich treffe diesen die 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; } }
quelle
Makes
Autos, aber dieses Auto hat nur einesMake
. Es liest sich nicht immer am besten, aber ich sehe es als Aufzählung, die eine Liste von möglichen istMakes
.Es gibt kein spezifisches technisches Problem damit. Dies kann die Lesbarkeit beeinträchtigen oder verbessern. In der Tat haben einige Microsoft-Bibliotheken diese Art von Eigenschaften (insbesondere bei
enum
Eigenschaften ist dies normalerweise sinnvoll).quelle
Dieses allgemeine Muster ist einer der Gründe, warum ich es immer verwende,
this
wenn ich auf ein Instanzmitglied innerhalb einer Klasse verweise. zB immerthis.SomeMethod(this.SomeProperty);
und niemals
In den meisten Fällen gibt es keine tatsächliche Mehrdeutigkeit, aber ich finde, es hilft, die Dinge zu klären. Außerdem wissen Sie jetzt, wo die Eigenschaft / Methode definiert ist.
quelle
Es kann natürlich etwas verwirrend sein, wenn der Name einer Eigenschaft und ihr Typ identisch sind, aber ansonsten ist es kein wirkliches Problem.
Wenn der Name Sinn macht, ist es normalerweise besser, den Namen und den Typ gleich zu lassen. Wenn Sie sich einen besseren Namen vorstellen können, sollten Sie diesen natürlich verwenden, aber Sie sollten nicht versuchen, um jeden Preis einen Namen zu finden, nur um diese Situation zu vermeiden.
quelle
Ich gebe den Dingen den gleichen Namen wie ihrem Typ, außer in Groß- und Kleinschreibung: Meine Methoden und Eigenschaften sind "lowerCase"; und ich hätte daher nicht das Problem, das 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 sind
m_b1
also Mitgliedsdaten,b1
eine Eigenschaft (oder eine lokale Variable oder ein Parameter) undB1
der Name der Klasse.quelle