Можно ли создать новый тип в C #? - PullRequest
4 голосов
/ 11 октября 2011

Я хочу создать новый тип, т.е. е:

[sbyte  (1 Byte) Value-range :        -128 to +127]
[byte   (1 Byte) Value-range :           0 to +255]    
[short  (2 Byte) Value-range :      -32768 to +32767]
[ushort (2 Byte) Value-range :           0 to +65535]    
[int    (4 Byte) Value-range : -2147483648 to +2147483647]
[uint   (4 Byte) Value-range :           0 to +4294967295]
.
.
.
etc.

Теперь я хочу создать тип LInt (LowInt) в диапазоне от 0 до 200000, поэтому я не хочу использовать uint или int.

Возможно ли это с C #?

Спасибо!

Ответы [ 5 ]

3 голосов
/ 11 октября 2011

Да, для этого и нужны классы. Теперь вы не можете создать новый «встроенный» тип. Семантика может не совпадать, но я предполагаю, что вы не будете слишком заботиться об этих различиях.

2 голосов
/ 11 октября 2011

Это невозможно встроенным способом, используя простой язык, например int<5000,20000>.

Хотя это возможно с более сложным определением, это не легко. Трудно определить и определить всю семантику, которую вы хотите, например:

  • Преобразование в другие типы дальнего боя
  • Преобразование из встроенных числовых типов
  • Что должно произойти при переполнении / недостаточном потоке
  • Каким должен быть диапазон результирующего типа после выполнения арифметики

Такое решение также не будет охватывать случаи, когда вы хотите, чтобы диапазон типов одного параметра был ограничен на основе значения другого параметра.

Альтернативой может быть использование что-то вроде Code Contracts для определения контрактов для вашего кода, чтобы вы могли выполнять произвольные статические проверки (во время компиляции).

Редактировать : Удалена ссылка на SpecSharp. Похоже, его заменили кодовыми контрактами ...

0 голосов
/ 11 октября 2011

Это бесполезно. Архитектура вашего процессора определяет, какие куски данных он может обрабатывать одновременно и для каких целей. Даже если вы создали тип, который разрешен только для различных значений min-max (которые вы можете реализовать в перегрузке класса и оператора), он не будет более эффективным ни в отношении памяти, ни в плане производительности.

Если вы хотите просто применить некоторую семантику, вот кое-что, что должно привести вас в правильном направлении (оно никоим образом не завершено и не поддерживает проверено и не проверено ключевые слова ).

struct MyInt
{
    static uint max = 200000;
    readonly uint i;
    public MyInt(uint i) {
        this.i = i;
    }

    public static implicit operator MyInt(uint j) {
        if(j > max)
            throw new ArgumentException();
        return new MyInt(j);
    }

    public static MyInt operator +(MyInt i, uint j) {
        try {
            return new MyInt(i.i + j);
        }
        catch(ArgumentException) {
            throw new OverflowException();
        }
    }

    public override string ToString ()
    {
        return i.ToString();
    }
}
0 голосов
/ 11 октября 2011

Вы можете создать объект и обработать ваши условия, если вы хотите, чтобы он действовал больше как примитивная попытка сделать его структурой

0 голосов
/ 11 октября 2011

вы также можете использовать структуру для создания типа, но вы не можете создать примитивный тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...