111 votes

Alias d'espace de nom C# - à quoi bon ?

Où ou quand utiliserait-on l'aliasing d'espace de nom comme

 using someOtherName =  System.Timers.Timer;

Il me semble que cela ne ferait qu'ajouter de la confusion à la compréhension de la langue.

11 votes

Que diriez-vous d'un système étendu using int = System.Int32 en C# ? C'est utile, n'est-ce pas ? C'est le même usage qui peut être exploité ailleurs.

0 votes

@nawfal Je crois que les alias de type ne sont pas exportables. Cela signifie que vous ne pouvez pas définir quelque chose comme using int = System.Int32 et l'utiliser dans d'autres endroits que le fichier de déclaration. Ainsi, cette int a Int32 L'alias peut soit être obtenu par d'autres moyens, soit être une chose spéciale dans le compilateur/exécutant.

1 votes

@KFL c'est vrai, mais l'avantage que les deux offrent est de même nature.

184voto

Marc Gravell Points 482669

Il s'agit d'un alias de type, et non d'un alias d'espace de nom ; il est utile de désambiguïser - par exemple, contre :

using WinformTimer = System.Windows.Forms.Timer;
using ThreadingTimer = System.Threading.Timer;

(ps : merci pour le choix de Timer ;-p)

Sinon, si vous utilisez les deux System.Windows.Forms.Timer y System.Timers.Timer dans le même fichier, vous devrez continuer à donner les noms complets (puisque Timer pourrait prêter à confusion).

Il joue également un rôle dans extern alias pour l'utilisation de types avec le même nom de type entièrement qualifié provenant de différents assemblages - rare, mais utile d'être supporté.


En fait, je peux voir une autre utilisation : lorsque vous voulez un accès rapide à un type, mais que vous ne voulez pas utiliser la fonction régulière using parce que vous ne pouvez pas importer certaines méthodes d'extension conflictuelles... un peu alambiqué, mais... voici un exemple...

namespace RealCode {
    //using Foo; // can't use this - it breaks DoSomething
    using Handy = Foo.Handy;
    using Bar;
    static class Program {
        static void Main() {
            Handy h = new Handy(); // prove available
            string test = "abc";            
            test.DoSomething(); // prove available
        }
    }
}
namespace Foo {
    static class TypeOne {
        public static void DoSomething(this string value) { }
    }
    class Handy {}
}
namespace Bar {
    static class TypeTwo {
        public static void DoSomething(this string value) { }
    }
}

8 votes

Il peut être utilisé pour aliaser les espaces de noms ou les noms de types.

2 votes

@Sean : oui, mais l'exemple donné était pour un type

0 votes

@lupefiasco : c'est pratique pour l'OP de choisir. System.Timers.Timer ;-p

28voto

BenAlabaster Points 20189

Je l'utilise lorsque j'ai plusieurs espaces de noms avec des sous-espaces de noms et/ou des noms d'objets conflictuels. Vous pourriez simplement faire quelque chose comme [par exemple] :

using src = Namespace1.Subspace.DataAccessObjects;
using dst = Namespace2.Subspace.DataAccessObjects;

...

src.DataObject source = new src.DataObject();
dst.DataObject destination = new dst.DataObject();

Qui, sinon, devrait être écrit :

Namespace1.Subspace.DataAccessObjects.DataObject source = 
  new Namespace1.Subspace.DataAccessObjects.DataObject();

Namespace2.Subspace.DataAccessObjects.DataObject dstination = 
  new Namespace2.Subspace.DataAccessObjects.DataObject();

Il permet d'économiser une tonne de frappe et peut être utilisé pour rendre le code beaucoup plus facile à lire.

19voto

Joel Mueller Points 14985

Outre les exemples mentionnés, les alias de type (plutôt que les alias d'espace de nom) peuvent être pratiques lorsqu'il s'agit de faire référence de manière répétée à des types génériques :

Dictionary<string, SomeClassWithALongName> foo = new Dictionary<string, SomeClassWithALongName>();

private void DoStuff(Dictionary<string, SomeClassWithALongName> dict) {}

Versus :

using FooDict = Dictionary<string, SomeClassWithALongName>;

FooDict foo = new FooDict();

private void DoStuff(FooDict dict) {}

9voto

annakata Points 42676

La brièveté.

Il y a des avantages marginaux pour fournir une clarté entre les espaces de noms qui partagent des noms de types, mais essentiellement c'est juste du sucre.

0 votes

Il indique clairement le symbole que vous utilisez. Ce n'est pas juste du sucre, mais un peu verbeux (si vous ne voulez pas définir un nouveau nom).

7voto

bdukes Points 54833

Je l'utilise toujours dans des situations comme celle-ci

using Utility = MyBaseNamespace.MySubNamsepace.Utility;

donde Utility aurait autrement un contexte différent (comme MyBaseNamespace.MySubNamespace.MySubSubNamespace.Utility ), mais je m'attends/préfère Utility pour toujours pointer vers cette classe particulière.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X