定义类型别名

时间:2012-02-13 09:17:45

标签: c# types

Pascal的一个特性我发现非常有用的是命名数据类型的能力,例如

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

var
 me: person;
 you: person;

etc

你能用C#做类似的事吗?我希望能够做类似

的事情
using complexList = List<Tuple<int,string,int>>;

complexList peopleList;
anotherList otherList;

因此,如果我必须更改数据类型的定义,我可以在一个地方完成。

C#是否支持实现此目的的方法?

7 个答案:

答案 0 :(得分:66)

是的,这是可能的。 你可以写:

using System;
using System.Collections.Generic;

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

或者,如果在命名空间外声明:

using System;
using System.Collections.Generic;

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

namespace ConsoleApplication12
{
}

然后将其用作类型:

MyAlias test = new MyAlias();

答案 1 :(得分:52)

这不是你在Pascal中所做的,但你可以使用using - 指令。请查看how to use it

示例:

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();
        }
    }
}

答案 2 :(得分:17)

您可以创建一个类型:

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

这与别名并不完全相同,但在大多数情况下,您不应该看到任何差异。

答案 3 :(得分:14)

继承怎么样?

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

var complexList = new ComplexList();

这似乎是一个类似的概念,但在C#中没有直接等效的基于类型的别名,只有namespace aliases

如果您想避免在代码中出现类型名称冲突,可以使用命名空间别名。

如果要创建一个“是”另一种类型的实例的新类型,继承是一种选择。

答案 4 :(得分:6)

从初始问题中显示的语法来看,看起来你真的只是问如何在C#中创建一个类,而不是如何为一个类型设置别名。

如果你想要一个比List<Tuple<int,string,int>>更简单的名字,并且你希望它是“全局”(即不是每个文件),我会创建一个继承所述类并且没有声明其他成员的新类。像这样:

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

这提供了一个管理位置,不需要额外的使用语句。

但是,我还会更进一步,冒险你可能不想要一个元组,而是另一个类,例如:

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; 
    }
}

然后对于您的列表类型,您可以执行以下操作:

public class PersonList: List<Person> { }

此外,如果您需要其他列表特定的帮助器属性或方法,您也可以将它们添加到PersonList类中。

答案 5 :(得分:3)

是的,你可以这样做,但是你需要指定完整的类型,即定义变为:

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

这是针对每个文件指定的,非常类似于命名空间的using指令。

nitpick:传统上,.NET中的一种类型是PascalCased。

答案 6 :(得分:0)

只需简单的使用即可:

using Foo = System.UInt16;

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