InstanceOf является предупреждением плохого Объектно-ориентированного проектирования.
Текущие JVMs означают , instanceOf не является большой частью беспокойства производительности сам по себе. Если Вы используете его много, специально для базовой функциональности, пора, вероятно, посмотреть на дизайн. Производительность (и простота/пригодность для обслуживания) усиления рефакторинга к лучшему дизайну значительно перевесит любые фактические циклы процессора, потраченные на фактическое вызов instanceOf.
Для предоставления очень небольшого упрощенного примера программирования.
if (SomeObject instanceOf Integer) {
[do something]
}
if (SomeObject instanceOf Double) {
[do something different]
}
плохая архитектура, лучший выбор состоял бы в том, чтобы сделать, чтобы SomeObject был родительским классом двух дочерних классов, где каждый дочерний класс переопределяет метод (doSomething), таким образом, код выглядел бы как таковым:
Someobject.doSomething();
Console.WriteLine(dt2 != null ? dt2.Value.ToString("yyyy-MM-dd hh:mm:ss") : "n/a");
РЕДАКТИРОВАТЬ: Как указано в другие комментарии, проверьте наличие ненулевого значения.
Обновление: как рекомендовано в комментариях, метод расширения:
public static string ToString(this DateTime? dt, string format)
=> dt == null ? "n/a" : ((DateTime)dt).ToString(format);
И, начиная с C # 6, вы можете использовать условный оператор NULL чтобы еще больше упростить код. Приведенное ниже выражение вернет null, если DateTime?
имеет значение null.
dt2?.ToString("yyyy-MM-dd hh:mm:ss")
Я думаю, вам нужно использовать GetValueOrDefault-Methode. Поведение с ToString ("yy ...") не определено, если экземпляр имеет значение NULL.
dt2.GetValueOrDefault().ToString("yyy...");
Как утверждали другие, вам необходимо проверить значение null перед вызовом ToString, но, чтобы не повторяться, вы можете создать метод расширения, который делает это, например:
public static class DateTimeExtensions {
public static string ToStringOrDefault(this DateTime? source, string format, string defaultValue) {
if (source != null) {
return source.Value.ToString(format);
}
else {
return String.IsNullOrEmpty(defaultValue) ? String.Empty : defaultValue;
}
}
public static string ToStringOrDefault(this DateTime? source, string format) {
return ToStringOrDefault(source, format, null);
}
}
который может может быть вызван следующим образом:
DateTime? dt = DateTime.Now;
dt.ToStringOrDefault("yyyy-MM-dd hh:mm:ss");
dt.ToStringOrDefault("yyyy-MM-dd hh:mm:ss", "n/a");
dt = null;
dt.ToStringOrDefault("yyyy-MM-dd hh:mm:ss", "n/a") //outputs 'n/a'
Проблема с формулировкой ответа на этот вопрос заключается в том, что вы не указываете желаемый результат, когда значение datetime, допускающее значение NULL, не имеет. Следующий код выведет DateTime.MinValue
в таком случае и, в отличие от принятого в настоящее время ответа, не вызовет исключения.
dt2.GetValueOrDefault().ToString(format);
Вы можете использовать dt2.Value.ToString ("формат")
, но, конечно, для этого требуется, чтобы dt2! = null, а это в первую очередь отрицает использование типа, допускающего значение NULL.
Здесь есть несколько решений, но главный вопрос: как вы хотите отформатировать дату null
?
Примерьте этот размер:
Фактический объект dateTime, который вы хотите форматировать, находится в свойстве dt.Value, а не в самом объекте dt2.
DateTime? dt2 = DateTime.Now;
Console.WriteLine(dt2.HasValue ? dt2.Value.ToString("yyyy-MM-dd hh:mm:ss") : "[N/A]");
Вот более общий подход. Это позволит вам форматировать строку любого типа значения с нулевым значением. Я включил второй метод, чтобы можно было переопределить значение строки по умолчанию вместо того, чтобы использовать значение по умолчанию для типа значения.
public static class ExtensionMethods
{
public static string ToString<T>(this Nullable<T> nullable, string format) where T : struct
{
return String.Format("{0:" + format + "}", nullable.GetValueOrDefault());
}
public static string ToString<T>(this Nullable<T> nullable, string format, string defaultValue) where T : struct
{
if (nullable.HasValue) {
return String.Format("{0:" + format + "}", nullable.Value);
}
return defaultValue;
}
}