2017-01-25 4 views
0

Я новичок в C#. Я могу использовать вашу помощь ниже. У меня есть следующий код.Установка значения в поле внутри объекта «Только», если значение не является нулевым в C#

private void foo(TropicalRequest tropicalRequest) 
    { 
    var buildRequest = new RestRequest() 
    { 
     BaseUrl = tropicalRequest.baseUrl, 
     StatusCode = tropicalRequest.statusCode, 
     InitialDate = tropicalRequest.createdDate.Value 
    }; 
    //Code call to save into DB 
    } 

Поле «tropicalRequest.createdDate.Value» не содержит значения для каждого сценария, когда оно равно нулю мой код брейки. Я написал код ниже, но я хочу его оптимизировать, ваша помощь очень ценится.

private void foo(TropicalRequest tropicalRequest) 
    { 
    var buildRequest = new RestRequest() 
    { 
     BaseUrl = tropicalRequest.baseUrl, 
     StatusCode = tropicalRequest.statusCode 
    }; 

    if(tropicalRequest.createdDate.HasValue) 
     buildRequest.InitialDate = tropicalRequest.CreatedDate.Value; 
    //Code call to save into DB 
    } 

В принципе, я хочу установить значение в поле внутри объекта, только если значение не равно нулю.

Редактировать # 1: InitialDate и CreatedDate являются данными DataType DateTimeOffset.

Редактировать # 2: InitialDate не имеет значения NULL и CreateDate имеет значение NULL DateTimeOffset.

+0

Что не так с текущим кодом? он установит значение для 'InitialDate', если' createdDate.HasValue' правильно? –

+0

ничего плохого, есть ли лучший способ или более короткий способ написания оператора if в создании объекта? – ndavid9

+0

Являются ли ваши свойства nullable DateTimeOffset или является InitialDate, не равным null DateTimeOffset, а CreateDate of TropicalRequest имеет значение NULL? –

ответ

0

Он уже оптимизирован компилятором. Если вы просто хотите форматировать код по-другому, вы можете использовать этот синтаксис. Таким образом, CreateDate будет использоваться, если есть значение, и в противном случае значение, указанное на другой стороне? синтаксис, в данном случае по умолчанию (DateTimeOffset), который будет таким же, как не назначать. Поэтому можно утверждать, что ваш текущий синтаксис на самом деле «лучше», чем этот.

private void foo(TropicalRequest tropicalRequest) 
{ 
    var buildRequest = new RestRequest() 
    { 
     BaseUrl = tropicalRequest.baseUrl, 
     StatusCode = tropicalRequest.statusCode, 
     InitialDate = tropicalRequest.CreatedDate ?? default(DateTimeOffset); 
    }; 
} 

Как ваш InitialDate не является нулевой DateTimeOffset будет всегда инициализируется по умолчанию значения DateTimeOffset, даже если вы не назначаете его.

+0

этот подход работал. Я пробовал то же самое с tropicalRequest.CreatedDate.Value ?? по умолчанию (DateTimeOffset); Вот почему это не сработало. Еще раз спасибо :) – ndavid9

1

Вы можете использовать нулевой оператор Размножение:

var buildRequest = new RestRequest() 
{ 
    BaseUrl = tropicalRequest.baseUrl, 
    StatusCode = tropicalRequest.statusCode, 
    InitialDate = tropicalRequest.createdDate ?? default(DateTimeOffset) 
}; 
+1

Вы уверены, что синтаксис? .Value? Значение DateTime отсутствует. –

+0

Да.Если значение null в первом случае InitialDate становится нулевым, во втором случае - по умолчанию (DateTime). [Здесь] (http://stackoverflow.com/questions/34601091/null-propagation-operator) некоторая информация о нулевом операторе распространения. – Markeli

+0

попробовал это, работа dint, потому что поле не равно NULL. когда я использую значение по умолчанию (DatetimeOffset), я получаю сообщение об ошибке: «операнд не может быть применен к операндам Datetimeoffset». – ndavid9

0

Важное замечание, значение по умолчанию для объекта DateTime является его MinValue что означает, если вы не назначили ничего означает, что его значение будет 01/01/0001 00:00:00. Рассмотрим во втором примере tropicalRequest.CreatedDate: buildRequest.InitialDate будет минимальным.

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

DateTime? InitialDate; 

Если вы объявили, как это в классе, то вам не нужно проверить с HasValue собственности. вы можете прямо присваивать это значение InitialDate = tropicalRequest.createdDate

Как указано в другом ответе, вы можете попробовать Null-conditional Operators оператор Если вы используете c# 6.0. или использовать условный оператор:

var buildRequest = new RestRequest() 
{ 
    BaseUrl = tropicalRequest.baseUrl, 
    StatusCode = tropicalRequest.statusCode, 
    InitialDate = tropicalRequest.createdDate.HasValue ? tropicalRequest.CreatedDate.Value : DateTime.MinValue; 
}; 
+0

этот подход установит минимальное значение, мое требование - оставить поле в покое, если значение равно null. – ndavid9

+0

@ ndavid9: 'DateTime.MinValue' является значением по умолчанию для объекта DateTime, если вы хотите, чтобы оно было null, вы должны сделать его как объект Nullable DateTime. –

+0

Да, я понимаю, но в моем сценарии InitialDate не имеет значения NULL, а CreateDate имеет значение NULL. Также он имеет тип DateTimeOffset, а не dateTime «DateTimeOffset? CreatedDate {get; set;}» – ndavid9