web-dev-qa-db-fra.com

Définir des alias de type

Une fonctionnalité de Pascal que j’ai trouvée très utile est la possibilité de nommer un type de données, par exemple

type
 person: record
             name: string;
             age: int;
         end;

var
 me: person;
 you: person;

etc

Pouvez-vous faire quelque chose de similaire en C #? Je veux pouvoir faire quelque chose comme

using complexList = List<Tuple<int,string,int>>;

complexList peopleList;
anotherList otherList;

Donc, si je dois changer la définition du type de données, je peux le faire à un endroit.

Est-ce que C # prend en charge un moyen d'y parvenir?

53
haughtonomous

Ce n'est pas exactement ce que vous faites en Pascal, mais vous pouvez utiliser la directive using-. Jetez un coup d'oeil ici sur comment l'utiliser

Exemple:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MyList = Dummy2.CompleXList;

namespace Dummy2
{
    public class Person 
    {
    }

    public class CompleXList : List<Person> 
    { 
    }


    class Program
    {
        static void Main(string[] args)
        {
            MyList l1 = new MyList();
        }
    }
}
50
Mithrandir

Oui, c'est possible ... vous pouvez écrire:

using System;
using System.Collections.Generic;

namespace ConsoleApplication12
{
    using MyAlias = List<Tuple<int, string, int>>;
}

ou, si déclaré en dehors de l'espace de noms:

using System;
using System.Collections.Generic;

using MyAlias = System.Collections.Generic.List<System.Tuple<int, string, int>>;

namespace ConsoleApplication12
{
}

puis utilisez-le comme type:

MyAlias test = new MyAlias();
65
ken2k

Vous pouvez créer un type:

class ComplexList : List<Tuple<int,string,int>> { }

Ce n'est pas strictement identique à un alias, mais dans la plupart des cas, vous ne devriez voir aucune différence.

17
Serge Wautier

Qu'en est-il de l'héritage?

class ComplexList : List<Tuple<int, string, int>> {}

var complexList = new ComplexList();

Cela semble être un concept similaire, mais il n’existe pas d’équivalent direct d’un alias basé sur un type en C #, mais uniquement de pseudonymes namespace .

Si vous souhaitez éviter les conflits de noms de types dans votre code, l'aliasing des espaces de noms est la solution.

Si vous voulez créer un nouveau type qui "est une" instance d'un autre type, l'héritage est une option. 

14
Jodrell

D'après la syntaxe indiquée dans la question initiale, il semble que vous demandez simplement comment créer une classe en C # et non comment aliaser un type.

Si vous souhaitez entrer un nom plus simple que List<Tuple<int,string,int>> et si vous voulez qu'il soit "global" (c'est-à-dire pas par fichier), je créerais une nouvelle classe qui hériterait de ladite classe sans déclarer de membre supplémentaire. Comme ça:

public class MyTrinaryTupleList: List<Tuple<int,string,int>> { }

Cela donne un seul emplacement de gestion et ne nécessite pas d’instructions d’utilisation supplémentaires.

Cependant, je voudrais aussi aller un peu plus loin et affirmer que vous ne voulez probablement pas un tuple, mais plutôt une autre classe, telle que:

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public int FavoriteNumber { get; set; }

    public Person() { }

    public Person(string name, int age, int favoriteNumber) 
    { 
        this.Name = name; 
        this.Age = age; 
        this.FavoriteNumber = favoriteNumber; 
    }
}

Et pour votre type de liste, vous pouvez effectuer les opérations suivantes:

public class PersonList: List<Person> { }

En outre, si vous avez besoin d'autres propriétés ou méthodes d'assistance spécifiques à la liste, vous pouvez également les ajouter à la classe PersonList.

6
BrainSlugs83

Oui, vous pouvez le faire, mais vous devez spécifier les types complets, c’est-à-dire que la définition devient:

using ComplexList = System.Collections.Generic.List<System.Tuple<int,string,int>>;

Ceci est spécifié par fichier, un peu comme les directives using pour les espaces de noms.

nitpick: Classiquement, un type dans .NET est PascalCased.

3
flq

Juste une simple utilisation ferait:

using Foo = System.UInt16;

public class Test {
  public Foo Bar { get;set; }
}
0
juFo