2015-04-27 6 views
8

В Haskell существует два способа предоставления псевдонима для типов: type и newtype. type обеспечивает синоним типа, что означает синоним рассматривается проверки типов, как точно так же, как и тип исходного:Что такое C#, эквивалентный новому типу Haskell?

type UserId = Int 
hasAccess :: UserId -> Bool 
hasAccess id = {-- stuff --} 

-- Elsewhere in the program 
login :: Int -> Bool 
login n = hasAccess n -- Typechecker won't complain 

newtype подобен, но рассматривается по типу проверки в качестве другого типа :

newtype UserId = UserId Int 
hasAccess :: UserId -> Bool 
hasAccess (UserId id) = {-- stuff --} 

-- Elsewhere in the program 
login :: Int -> Bool 
login n = hasAccess n -- Typechecker will complain, n isn't a UserId ! 

В C#, вы можете определить тип синонимы с верхним уровнем using декларации:

using UserId = Int; 

Однако строго типизированный псевдоним типа компилятора, по-видимому, не присутствует в C#. Я изучил автоматическое создание кода с помощью шаблонов T4 и CodeDOM для создания оболочки класса, но я действительно не знаю, как я мог бы полностью интегрировать их в поток программирования.

В идеале, я хотел бы быть в состоянии сказать, на высшем уровне:

// Something like this? 
using Int.UserId; 

/* Elsewhere */ 
var id = new UserId(5); 

public bool HasAccess(UserId id) 
{ 
    /* Stuff */ 
} 

Это начинает генерацию кода в передаче во время компиляции. Если это невозможно или предоставляет проблему с курицей и яйцом для IntelliSense, автоматический вариант компиляции, который запускает каждые x минут (или кнопку или что-то еще), будет приятным.

+2

Можете ли вы указать, почему вы хотите это сделать? –

+0

Зачем вам нужно составлять код каждые x минут? – Georg

+1

Каково использование скрытия типа под другим именем? – Franck

ответ

13

Нет, у C# такой функции нет. Наиболее близким к этому может быть структура.

public struct UserId 
{ 
    public int Id { get; private set; } 

    public UserId(int id) : this() { Id = id; } 
} 

Таким образом, компилятор действительно лечит UserId и int, как различные типы. Кроме того, вы можете добавить дополнительные методы к UserId, которые имеют смысл, учитывая тот факт, что ваш int фактически является идентификатором пользователя. Обратите также внимание на то, что это не оказывает никакого влияния на среду выполнения, используя структуру с одним полем int, не вызывает никаких накладных расходов непосредственно от использования int.

Редактировать: Поскольку вы спросили о T4, если вы работаете с Visual Studio, вы можете легко создать новый текстовый шаблон T4, который будет расширяться до (C#) - кода и будет скомпилирован автоматически. Шаблон будет выполняться каждый раз, когда вы его сохраните.

+1

Важная вещь о новых типах в Haskell заключается в том, что они очень дешевая абстракция (фактически они полностью оптимизированы после проверки типа). В этом смысле тоже правильные ответы. – kqr

Смежные вопросы