Каков “базовый класс” для типов числового значения C#?

Это дао, ну и фактически репозиторий , но не слишком беспокоиться об этой разнице, поскольку он обращается к базе данных, используя контекст persistence.

Вы должны создайте класс обслуживания, который обертывает этот метод и где вызывается транзакция.

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

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

Это добавляет дополнительный уровень абстракции, делая будущий рефакторинг более гибким.

46
задан mike nelson 6 May 2009 в 10:12
поделиться

6 ответов

Ответ таков: вам не нужно предоставлять перегрузки для ВСЕХ числовых типов, только для Double и Десятичный . Все остальные (за исключением, может быть, очень необычно больших) будут автоматически преобразованы в них.

Не базовый класс , но фактически это была красная сельдь. Базовый класс System.ValueType мало помогает, поскольку он включает типы, которые не являются числовыми. Ссылка на язык, которую я читал, в первую очередь привела меня в замешательство:)

(я просто искал, кому приписать ответ, и это была комбинация Пугало и Марка Гравелла, но так как они были комментариями, я имею поставьте ответ здесь)

24
ответ дан 26 November 2019 в 20:38
поделиться

Нет ни одного (или, по крайней мере, ни одного, который просто означает «числа»). Вы можете использовать:

void Foo<T>(T value) where T : struct {...}

Но это позволяет использовать любую структуру - не только числа. Если вы хотите сделать арифметику, могут быть полезны универсальные операторы . Кроме этого; перегружает его наиболее жизнеспособным вариантом.

13
ответ дан Marc Gravell 8 November 2019 в 00:23
поделиться

Что я делаю:

 public interface INumeric<T>
 {
     T Zero { get; }
     T One { get; }
     T MaxValue { get; }
     T MinValue { get; }
     T Add(T a, T b);
     // T Substract(....
     // T Mult...
 }  

 public struct Numeric: 
     INumeric<int>, 
     INumeric<float>,
     INumeric<byte>,
     INumeric<decimal>,
     // INumeric<other types>
 {
     int INumeric<int>.Zero => 0;
     int INumeric<int>.One => 1;
     int INumeric<int>.MinValue => int.MinValue;
     int INumeric<int>.MaxValue => int.MaxValue;
     int INumeric<int>.Add(int x, int y) => x + y;

     // other implementations...
 }

Теперь вы можете использовать его в методе:

bool IsZero<TNum, T>(TNum ops, T number) 
   where TNum : INumeric<T>
{
   return number == ops.Zero;      
}

или в методе расширения

 public static bool IsZero<TNum, T>(this TNum ops, T number)
      where TNum : INumeric<T>
 {
      return number == ops.Zero;
 }

и в вашем код:

 ...
 var n = new Numeric(); // can be an static prop

 Console.WriteLine(IsZero(n, 5)); // false
 Console.WriteLine(IsZero(n, 0f)); // true
 Console.WriteLine(IsZero(n, "0")); // compiler error

или, с методом расширения:

 Console.WriteLine(n.IsZero(5));  // false
 Console.WriteLine(n.IsZero(0f)); // true
 Console.WriteLine(n.IsZero("0")); // compiler error
7
ответ дан Luis 8 November 2019 в 00:23
поделиться

Перегружены ли сигнатуры методов здесь? Если вы хотите, чтобы ограниченная группа методов выполняла одну и ту же задачу, вы можете загрузить открытый метод и вызвать закрытый метод, который принимает любое число, путем преобразования входных данных в двойные.

0
ответ дан Greg B 8 November 2019 в 00:23
поделиться

Краткий ответ: числовые типы являются типами значений, поэтому они являются производными от System.ValueType. Полный ответ: вы должны прочитать эту статью из MSDN . Более того, я думаю, что вы должны прочитать справочник по языку C # :). Тип значения не равен числовому типу, поскольку типы значений включают также структуры и перечисления.

10
ответ дан 26 November 2019 в 20:38
поделиться

Базовым классом числовых типов является ValueType .

К сожалению, это все равно не поможет: DateTime , bool , Enum и сотни других типов также являются производными от ValueType . В .NET нет базового класса NumericType .

5
ответ дан 26 November 2019 в 20:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: