Определение псевдонимов типов
Одной из особенностей Pascal, которую я нашел очень полезной, была возможность назвать тип данных, например
type
person: record
name: string;
age: int;
end;
var
me: person;
you: person;
etc
Можете ли вы сделать что-то подобное в С#? Я хочу иметь возможность сделать что-то вроде
using complexList = List<Tuple<int,string,int>>;
complexList peopleList;
anotherList otherList;
Итак, если мне нужно изменить определение типа данных, я могу сделать это в одном месте.
Поддерживает ли С# способ достижения этого?
Ответы
Ответ 1
Не в порядке, что вы делаете в Pascal, но вы можете использовать using
-directive. Посмотрите здесь на как его использовать
Пример:
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
Да, это возможно.
Вы можете написать:
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();
Ответ 3
Вы можете создать тип:
class ComplexList : List<Tuple<int,string,int>> { }
Это не то же самое, что и псевдоним, но в большинстве случаев вы не должны видеть различий.
Ответ 4
Как насчет наследования?
class ComplexList : List<Tuple<int,string,int>> {}
var complexList = new ComplexList();
Это похоже на аналогичную концепцию (с преимуществами).
Ответ 5
Из синтаксиса, показанного в начальном вопросе, похоже, что вы действительно просто спрашиваете, как сделать класс на С#, а не как псевдоним типа.
Если вы хотите, чтобы более простое имя было напечатано, чем List<Tuple<int,string,int>>
, и вы хотите, чтобы оно было "глобальным" (т.е. не для файла), я бы создал новый класс, унаследовавший указанный класс, и не объявлял никаких дополнительных членов. Вот так:
public class MyTrinaryTupleList: List<Tuple<int,string,int>> { }
Это дает одно место управления, и нет необходимости в дополнительных операциях использования.
Однако я бы также сделал еще один шаг вперед и рискну, что вы, вероятно, не хотите 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.
Ответ 6
Да, вы можете это сделать, однако вам нужно указать полные типы, т.е. определение будет выглядеть следующим образом:
using ComplexList = System.Collections.Generic.List<System.Tuple<int,string,int>>;
Это указано для каждого файла, как и директивы using для пространств имен.
nitpick: Обычно тип .NET является PascalCased.
Ответ 7
Простое использование:
using Foo = System.UInt16;
public class Test {
public Foo Bar { get;set; }
}