定义类型别名
本文关键字:别名 类型 定义 | 更新日期: 2023-09-27 18:24:10
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#支持实现这一点的方法吗?
是的,这是可能的。这里的工作示例。你可以写:
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();
这不是您在Pascal中所做的,但您可以使用using
-指令。看看这里如何使用
示例:
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();
}
}
}
您可以创建一个类型:
class ComplexList : List<Tuple<int,string,int>> { }
这与别名并不完全相同,但在大多数情况下,您不应该看到任何差异。
是的,您可以这样做,但您需要指定完整的类型,即定义变为:
using ComplexList = System.Collections.Generic.List<System.Tuple<int,string,int>>;
这是按文件指定的,非常类似于命名空间的using指令。
挑剔:按照惯例,.NET中的一个类型是PascalCased。
从最初问题中显示的语法来看,您实际上只是在问如何在C#中创建一个类,而不是如何对类型进行别名。
如果您希望键入一个比List<Tuple<int,string,int>>
更简单的名称,并且希望它是"全局的"(即不是每个文件),我会创建一个新的类,该类继承了所述类,并且没有声明其他成员。像这样:
public class MyTrinaryTupleList: List<Tuple<int,string,int>> { }
这提供了一个单一的管理位置,并且不需要额外的using语句。
然而,我也会更进一步,大胆地说,你可能不想要Tuple,而是想要另一个类,比如:
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类中。
只需简单使用即可:
using Foo = System.UInt16;
public class Test {
public Foo Bar { get;set; }
}