J'ai parfois vu du code écrit comme ceci:
public class B1
{
}
public class B2
{
private B1 b1;
public B1 B1
{
get { return b1; }
set { b1 = value; }
}
}
c'est-à-dire que la classe B2 a une propriété nommée "B1", qui est également de type "B1".
Mon instinct me dit que ce n'est pas une bonne idée, mais y a-t-il des raisons techniques pour lesquelles vous devriez éviter de donner à une propriété le même nom que sa classe?
(J'utilise .net 2.0, au cas où cela compte).
C'est bon. L'exemple canonique ici est
public Background {
public Color Color { get; set; }
}
Il y a de rares problèmes (cas d'angle) qui surviennent ici, mais pas assez pour justifier d'éviter cet appareil. Franchement, je trouve cet appareil assez utile. Je n'apprécierais pas ne pas pouvoir faire ce qui suit:
class Ticker { ... }
public StockQuote {
public Ticker Ticker { get; set; }
}
Je ne veux pas avoir à dire Ticker StockTicker
ou Ticker ThisTicker
etc.
Microsoft Naming Guideline for Members indique:
Pensez à donner à une propriété le même nom que son type.
Lorsque vous avez une propriété fortement typée sur une énumération, le nom de la propriété peut être le même que le nom de l'énumération. Par exemple, si vous disposez d'une énumération nommée
CacheLevel
, une propriété qui renvoie l'une de ses valeurs peut également être nomméeCacheLevel
.
Bien que j'admette, il y a une petite ambiguïté, qu'ils recommandent cela pour les énumérations ou pour les propriétés en général.
Je ne peux penser qu'à un seul inconvénient. Si vous vouliez faire quelque chose comme ça:
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();
}
}
Vous devez plutôt utiliser:
MyNamespace.B1.MyFunc();
Un bon exemple de cela est une utilisation courante dans la programmation Winforms, où la classe System.Windows.Forms.Cursor chevauche la propriété System.Windows.Forms.Form.Cursor, de sorte que vos événements de formulaire doivent accéder aux membres statiques à l'aide de l'espace de noms complet .
Aujourd'hui même, Eric a blogué sur le problème de la "Couleur Couleur".
http://blogs.msdn.com/ericlippert/archive/2009/07/06/color-color.aspx
Personnellement, je l'éviterais si possible.
Un autre problème est avec les types internes.
Je rencontre celui-ci tout le temps:
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;
}
}
Il n'y a pas de problème technique spécifique. Cela pourrait endommager ou améliorer la lisibilité. En fait, certaines bibliothèques Microsoft ont ce type de propriétés (en particulier, avec les propriétés enum
, cela a généralement du sens).
Ce modèle courant est l'une des raisons pour lesquelles j'utilise toujours this
lorsque je me réfère à un membre d'instance dans une classe. par exemple. toujours
this.SomeMethod(this.SomeProperty);
et jamais
SomeMethod(SomeProperty);
Dans la plupart des cas, il n'y a pas d'ambiguïté réelle, mais je trouve que cela aide à clarifier les choses. De plus, vous savez maintenant où la propriété/méthode est définie.
Cela peut évidemment être un peu déroutant lorsque le nom d'une propriété et son type sont les mêmes, mais à part cela, ce n'est pas vraiment un problème.
Si le nom a du sens, il est généralement préférable de laisser le nom et le type identiques. Si vous pouvez penser à un meilleur nom, vous devriez bien sûr l'utiliser, mais vous ne devriez pas essayer de créer un nom à tout prix juste pour éviter cette situation.
Je donne aux choses le même nom que leur type, sauf pour le cas: mes méthodes et propriétés sont "lowerCase"; et je n'aurais donc pas le problème que MiffTheFox a.
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
}
}
Donc pour moi, m_b1
correspond aux données des membres, b1
est une propriété (ou une variable ou un paramètre local), et B1
est le nom de la classe.