Значение по умолчанию для типа во время выполнения [duplicate]

«Я иногда слышу о том, как SQL отстой, и это не очень хороший язык»

SQL старше 30 лет. «О том, какие функции делают что-то« хорошим »языком, а какие делают его« плохим », развивались быстрее, чем сам SQL.

Кроме того, SQL не является языком, который соответствует действующим стандартам «что нужно, чтобы быть реляционным», поэтому SQL просто не является реляционным языком для загрузки.

", но я никогда не слышал об альтернативах."

Я предлагаю вам задуматься над тем, что вы пытаетесь услышать только в неправильных местах (то есть, в коммерческой коммерческой индустрии СУБД исключительно).

«Итак, другие хорошие языки, которые выполняют одну и ту же цель (доступ к базе данных) и что делает их лучше, чем SQL? »

Date & amp; Darwen описывает функции, которые современный язык манипулирования данными должен соответствовать своим" Третий манифест ", последняя версия которого изложена в их книге« Базы данных, типы и реляционная модель ».

« Есть ли хорошие базы данных, которые используют t его альтернативный язык? »

Если« добром »вы имеете в виду что-то вроде« промышленной силы », то нет. Ближайшая доступная вещь, вероятно, будет Dataphor.

Проект Rel предлагает реализацию для языка Tutorial D, определенного в «Базах данных, типах и реляционной модели», но текущая основная цель Rel должна быть образовательный характер.

Мой проект SIRA_PRISE предлагает реализацию для «действительно реляционного» управления данными, но я смущаюсь также называть его «реализацией языка».

И, конечно же, , вы также можете изучить некоторые нереляционные вещи, как это предлагали некоторые, но я лично увольняю нереляционное управление данными как многолетнюю технологическую регрессию. Не стоит рассматривать, то есть.

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

146
задан Chuck Conway 26 March 2012 в 08:26
поделиться

5 ответов

На самом деле есть только две возможности: null для ссылочных типов и new myType () для типов значений (что соответствует 0 для int, float и т. Д.) Таким образом, вам действительно нужно учитывать только два случая:

object GetDefaultValue(Type t)
{
    if (t.IsValueType)
        return Activator.CreateInstance(t);

    return null;
}

(Поскольку типы значений всегда имеют конструктор по умолчанию, этот вызов в Activator.CreateInstance никогда не подведет).

248
ответ дан 23 November 2019 в 22:30
поделиться

Как насчет чего-то вроде ...

class Program
{
  static void Main(string[] args)
  {
    PrintDefault(typeof(object));
    PrintDefault(typeof(string));
    PrintDefault(typeof(int));
    PrintDefault(typeof(int?));
  }

  private static void PrintDefault(Type type)
  {
    Console.WriteLine("default({0}) = {1}", type,
      DefaultGenerator.GetDefaultValue(type));
  }
}

public class DefaultGenerator
{
  public static object GetDefaultValue(Type parameter)
  {
    var defaultGeneratorType =
      typeof(DefaultGenerator<>).MakeGenericType(parameter);

    return defaultGeneratorType.InvokeMember(
      "GetDefault", 
      BindingFlags.Static |
      BindingFlags.Public |
      BindingFlags.InvokeMethod,
      null, null, new object[0]);
  }
}

public class DefaultGenerator<T>
{
  public static T GetDefault()
  {
    return default(T);
  }
}

Он дает следующий результат:

default(System.Object) =
default(System.String) =
default(System.Int32) = 0
default(System.Nullable`1[System.Int32]) =
10
ответ дан 23 November 2019 в 22:30
поделиться

Что вы подразумеваете под "значением по умолчанию"? Все ссылочные типы («класс») имеют значение по умолчанию null, тогда как все типы значений будут иметь свои значения по умолчанию в соответствии с этой таблицей .

2
ответ дан 23 November 2019 в 22:30
поделиться

Вот функция, которая возвращает значение по умолчанию для nullable типа (другими словами, она возвращает 0 для обоих Decimal и Decimal?):

public static object DefaultValue(Type maybeNullable)
{
    Type underlying = Nullable.GetUnderlyingType(maybeNullable);
    if (underlying != null)
        return Activator.CreateInstance(underlying);
    return Activator.CreateInstance(maybeNullable);
}
1
ответ дан 23 November 2019 в 22:30
поделиться

Вы также можете добавить его как метод расширения в System.Type:

public static class TypeExtensions
{
    public static object GetDefaultValue(this Type t)
    {
        if (t.IsValueType && Nullable.GetUnderlyingType(t) == null)
            return Activator.CreateInstance(t);
        else
            return null;
    }
}
33
ответ дан 23 November 2019 в 22:30
поделиться
Другие вопросы по тегам:

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