web-dev-qa-db-fra.com

Comment gérer le même nom de classe dans différents espaces de noms?

J'essaie de créer une structure de bibliothèque commune. Je le fais en créant des projets séparés pour chaque bibliothèque commune que je veux

J'ai les 2 espaces de noms suivants: MyCompany.ERP et MyCompany.Barcode

J'ai besoin que les deux aient une classe nommée "Utilitaires" et soient statiques. Si je le fais, je devrai alors spécifier le nom de l'espace de nom complet avant ma classe statique afin d'y accéder.

Y a-t-il un autre moyen privilégié de le faire?

Ou je devrais aller chercher des noms différents dans des classes comme BarcodeUtils et ERPUtils ?

19
e4rthdog

Si je fais cela, je devrai alors spécifier le nom de l'espace de nom complet avant ma classe statique afin d'y accéder?

Non, cela n’est pas nécessaire, même si les détails dépendent de la classe qui utilisera ces types et les déclarations using it has.

Si vous utilisez uniquement one des espaces de noms de la classe, il n'y a pas d'ambiguïté et vous pouvez continuer et utiliser le type.

Si vous utilisez les deux espaces de noms, vous devrez soit qualifier complètement les utilisations, soit utiliser un espace de noms/type aliases pour lever la ambiguïté des types.

using ERPUtils = MyCompany.ERP.Utilities;
using BCUtils = MyCompany.Barcode.Utilities;

public void MyMethod()
{
  var a = ERPUtils.Method();
  var b = BCUtils.Method();
}
32
Oded

Il n'y a pas d'autre moyen. Vous pouvez créer un alias dans les directives using:

using MC=MyCompany.ERP;
using MB=MyCompany.Barcode;
...
public void Test()
{
  var a = MC.Utilities.Method();
  var b = MB.Utilities.Method();
}

C'est le moyen le plus simple de les gérer.

15
Johnny_D

Les directives de l’État membre sont les suivantes:

N'introduisez pas de noms de type génériques tels que Élément, Nœud, Journal et Message. Il existe une très forte probabilité que cela conduise à des conflits de noms de types dans des scénarios courants. 

et 

Ne donnez pas le même nom aux types dans les espaces de noms d'un même modèle d'application.

Je conviens que c’est probablement une bonne idée d’utiliser plutôt BarcodeUtilities et ErpUtilities. (À moins que les classes d'utilitaires ne soient pas conçues pour être utilisées par le code client, vous pouvez les nommer Utilities et les rendre internal.)

11
millimoose

"Utilitaires" n'est pas un très bon nom pour une classe, car il est beaucoup trop générique. Par conséquent, je pense que vous devriez renommer les deux en quelque chose de plus informatif.

7
Matthew Watson

Vous pouvez utiliser un alias:

using BarcodeUtils  =  MyCompany.Barcode.Utilities;

sur les pages vous avez des affrontements. Mais idéalement, renommez-les si cela se produit dans de nombreux endroits.

2
Paul Owens

Je suggère d'utiliser différents noms de classe. Si vous voulez vraiment appeler les deux utilitaires, vous pouvez utiliser la fonction alias de la directive using, par exemple.

using ERP = MyCompany.ERP;
using Barcode = MyCompany.Barcode;

...
    ERP.Utilities.SomeMethod();
    Barcode.Utilities.SomeMethod();
1
Matt Varblow

Vous devrez utiliser le chemin complet lorsque les deux portent le même nom. Sinon, vous obtiendrez une erreur de référence ambiguë.

Vous pouvez utiliser un alias mais cela vous évitera de taper:

using Project = PC.MyCompany.Project;

Je choisirais un nom un peu plus descriptif. UNE

0
Wouter de Kort

Cela dépend en fait du but de vos cours. Si vous allez distribuer votre Barcode.Utilities et votre ERP.Utilies séparément, il vaut mieux rester comme ça. D'autre part, si vous allez les utiliser seulement dans la même classe, vous pouvez utiliser la méthode 2. pour faciliter le code.

0
kkocabiyik