Как я использую DateTime. TryParse с Nullable <Дата и время>?

Когда вы объявляете ссылочную переменную (т. е. объект), вы действительно создаете указатель на объект. Рассмотрим следующий код, в котором вы объявляете переменную примитивного типа int:

int x;
x = 10;

В этом примере переменная x является int, и Java инициализирует ее для 0. Когда вы назначаете его 10 во второй строке, ваше значение 10 записывается в ячейку памяти, на которую указывает x.

Но когда вы пытаетесь объявить ссылочный тип, произойдет что-то другое. Возьмите следующий код:

Integer num;
num = new Integer(10);

Первая строка объявляет переменную с именем num, но она не содержит примитивного значения. Вместо этого он содержит указатель (потому что тип Integer является ссылочным типом). Поскольку вы еще не указали, что указать на Java, он устанавливает значение null, что означает «Я ничего не указываю».

Во второй строке ключевое слово new используется для создания экземпляра (или создания ) объекту типа Integer и переменной указателя num присваивается этот объект. Теперь вы можете ссылаться на объект, используя оператор разыменования . (точка).

Exception, о котором вы просили, возникает, когда вы объявляете переменную, но не создавали объект. Если вы попытаетесь разыменовать num. Перед созданием объекта вы получите NullPointerException. В самых тривиальных случаях компилятор поймает проблему и сообщит вам, что «num не может быть инициализирован», но иногда вы пишете код, который непосредственно не создает объект.

Например, вы можете имеют следующий метод:

public void doSomething(SomeObject obj) {
   //do something to obj
}

В этом случае вы не создаете объект obj, скорее предполагая, что он был создан до вызова метода doSomething. К сожалению, этот метод можно вызвать следующим образом:

doSomething(null);

В этом случае obj имеет значение null. Если метод предназначен для того, чтобы что-то сделать для переданного объекта, целесообразно бросить NullPointerException, потому что это ошибка программиста, и программисту понадобится эта информация для целей отладки.

Альтернативно, там могут быть случаи, когда цель метода заключается не только в том, чтобы работать с переданным в объекте, и поэтому нулевой параметр может быть приемлемым. В этом случае вам нужно будет проверить нулевой параметр и вести себя по-другому. Вы также должны объяснить это в документации. Например, doSomething может быть записано как:

/**
  * @param obj An optional foo for ____. May be null, in which case 
  *  the result will be ____.
  */
public void doSomething(SomeObject obj) {
    if(obj != null) {
       //do something
    } else {
       //do something else
    }
}

Наконец, Как определить исключение & amp; причина использования Трассировки стека

110
задан Alex Jolig 24 April 2016 в 06:07
поделиться

6 ответов

DateTime? d=null;
DateTime d2;
bool success = DateTime.TryParse("some date text", out d2);
if (success) d=d2;

(Могли бы быть более изящные решения, но почему Вы просто не делаете чего-то как выше?)

120
ответ дан Drew Noakes 24 November 2019 в 03:09
поделиться

Как Jason говорит, можно создать переменную правильного типа и передачи это. Вы могли бы хотеть инкапсулировать его в своем собственном методе:

public static DateTime? TryParse(string text)
{
    DateTime date;
    if (DateTime.TryParse(text, out date))
    {
        return date;
    }
    else
    {
        return null;
    }
}

... или если Вам нравится условный оператор:

public static DateTime? TryParse(string text)
{
    DateTime date;
    return DateTime.TryParse(text, out date) ? date : (DateTime?) null;
}

Или в C# 7:

public static DateTime? TryParse(string text) =>
    DateTime.TryParse(text, out var date) ? date : (DateTime?) null;
155
ответ дан Jon Skeet 24 November 2019 в 03:09
поделиться

Вот немного concised выпуск какой предложенный Jason:

DateTime? d; DateTime dt;
d = DateTime.TryParse(DateTime.Now.ToString(), out dt)? dt : (DateTime?)null;
20
ответ дан 24 November 2019 в 03:09
поделиться

Вы не можете, потому что Nullable<DateTime> другой тип к DateTime. Необходимо записать собственную функцию, чтобы сделать это,

public bool TryParse(string text, out Nullable<DateTime> nDate)
{
    DateTime date;
    bool isParsed = DateTime.TryParse(text, out date);
    if (isParsed)
        nDate = new Nullable<DateTime>(date);
    else
        nDate = new Nullable<DateTime>();
    return isParsed;
}

Hope, которой это помогает:)

РЕДАКТИРОВАНИЕ: Удаленный (очевидно), неправильно протестированный дополнительный метод, потому что (как Указанные некоторыми плохо hoor) дополнительные методы, которые пытаются изменить "этот" параметр, не будут работать с Типами Значения.

P.S. Плохим рассматриваемым Hoor является старый друг:)

19
ответ дан Binary Worrier 24 November 2019 в 03:09
поделиться

Это - один лайнер, Вы смотрите fo:

DateTime? d = DateTime.TryParse("some date text", out DateTime dt) ? dt : null;

, Если Вы хотите сделать это надлежащим методом псевдорасширения TryParse, можно сделать это:

public static bool TryParse(string text, out DateTime? dt)
{
    if (DateTime.TryParse(text, out DateTime date))
    {
        dt = date;
        return true;
    }
    else
    {
        dt = null;
        return false;
    }
}
0
ответ дан 24 November 2019 в 03:09
поделиться

Я не понимаю, почему Microsoft не справилась с этим. Небольшая умная утилита для решения этой проблемы (у меня была проблема с int, но замена int на DateTime будет иметь тот же эффект, может быть .....

    public static bool NullableValueTryParse(string text, out int? nInt)
    {
        int value;
        if (int.TryParse(text, out value))
        {
            nInt = value;
            return true;
        }
        else
        {
            nInt = null;
            return false;
        }
    }
1
ответ дан 24 November 2019 в 03:09
поделиться
Другие вопросы по тегам:

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