답변:
일반적인 DateTimes의 경우 초기화하지 않으면 DateTime.MinValue
참조 유형이 아닌 값 유형이기 때문에 일치 합니다.
다음과 같이 nullable DateTime을 사용할 수도 있습니다.
DateTime? MyNullableDate;
또는 더 긴 형태 :
Nullable<DateTime> MyNullableDate;
마지막으로 모든 유형의 기본값을 참조하는 내장 된 방법이 있습니다. 이것은 null
참조 유형을 반환 하지만 DateTime 예제에서는 다음과 동일을 반환합니다 DateTime.MinValue
.
default(DateTime)
또는 최신 버전의 C #에서는
default
DateTime.MinValue
아니라
MyNullableDate=date;
그것을 설정하고, 그것을 MyDate = MyNullableDate.Value;
읽고, if(MyNullableDate.HasValue)
널인지 확인해야합니다
.NET 2.0 이상을 사용하는 경우 널 입력 가능 유형을 사용할 수 있습니다.
DateTime? dt = null;
또는
Nullable<DateTime> dt = null;
나중에 :
dt = new DateTime();
그리고 당신은 값을 확인할 수 있습니다 :
if (dt.HasValue)
{
// Do something with dt.Value
}
또는 다음과 같이 사용할 수 있습니다.
DateTime dt2 = dt ?? DateTime.MinValue;
자세한 내용은 여기 ( http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx)를 참조하십시오.
dt.GetValueOrDefault()
- 그것이 가장 효율적인 옵션들 중 하나입니다.
날짜 시간? MyDateTime {get; set;}
MyDateTime = (dr["f1"] == DBNull.Value) ? (DateTime?)null : ((DateTime)dr["f1"]);
null
가 작동하지 않는 것을 발견하는 데 도움이되었습니다 . 이어야 (DateTime?)null
합니다.
nullable types 사용을 고려할 것 입니다.
DateTime? myDate
대신에 DateTime myDate
.
나는 항상 시간을로 설정했다 DateTime.MinValue
. 이 방법으로 NullErrorException이 발생하지 않으며 설정되지 않은 날짜와 비교할 수 있습니다.
경고-Nullable을 사용할 때 분명히 더 이상 '순수한'날짜 시간 객체가 아니므로 DateTime 멤버에 직접 액세스 할 수 없습니다. 시도하고 설명하겠습니다.
Nullable <>을 사용하면 기본적으로 DateTime을 컨테이너에 넣을 수 있습니다 (일반적으로 감사합니다). 이 컨테이너에는 위에서 언급 한 DateTime 객체에 대한 액세스를 제공하는 호출 할 수있는 자체 속성이 있습니다. 올바른 속성 (이 경우 Nullable.Value)을 사용한 후 표준 DateTime 멤버, 속성 등에 액세스 할 수 있습니다.
이제 DateTime 객체에 액세스하는 가장 좋은 방법에 대한 문제가 해결되었습니다. 몇 가지 방법이 있습니다. 1 번은 FAR이 가장 좋고 2 번은 "dude why"입니다.
Nullable.Value 속성을 사용하면
DateTime date = myNullableObject.Value.ToUniversalTime(); //Works
DateTime date = myNullableObject.ToUniversalTime(); //Not a datetime object, fails
Convert.ToDateTime ()을 사용하여 nullable 객체를 datetime으로 변환
DateTime date = Convert.ToDateTime(myNullableObject).ToUniversalTime(); //works but why...
이 시점에서 답변이 잘 문서화되어 있지만 Nullable의 사용법은 아마도 가치가 있다고 생각합니다. 동의하지 않으면 죄송합니다.
편집 : 세 번째 옵션이 약간 구체적이고 대소 문자에 따라 제거되었습니다.
날짜 / 시간 데이터 유형의 특성상 null
값을 포함 할 수 없습니다 ( 예 : 값을 포함해야 함). 공백이거나 아무 것도 포함 할 수 없습니다. 날짜 / 시간 변수를로 표시하면 nullable
널값 만 지정할 수 있습니다. 그래서 당신이 찾고있는 것은 두 가지 중 하나입니다 (더 많을 수도 있지만 두 가지만 생각할 수 있습니다).
값이 없으면 변수에 최소 날짜 / 시간 값을 지정하십시오. 최대 날짜 / 시간 값도 지정할 수 있습니다. 날짜 / 시간 값을 확인할 때 사이트 전체의 일관성을 유지하십시오. min
또는 사용을 결정 max
하고 그것에 충실하십시오.
날짜 / 시간 변수를로 표시하십시오 nullable
. 이렇게하면 변수가 null
없는 날짜 / 시간 변수를 설정할 수 있습니다 .
예제를 사용하여 첫 번째 요점을 보여 드리겠습니다. DateTime
변수의 유형은 내가로 설정하기 위하여려고하고,이 경우, 값을 필요 null로 설정할 수 없습니다 DateTime
값이없는 경우의 최소 값입니다.
내 시나리오는 BlogPost
수업 이 있다는 것 입니다. 많은 다른 필드 / 속성이 있지만이 예제에서는 두 개만 사용하기로 선택했습니다. DatePublished
게시물이 웹 사이트에 게시되고 날짜 / 시간 값을 포함해야하는 시점입니다. DateModified
게시물을 수정할 때이므로 값을 포함 할 필요는 없지만 값을 포함 할 수 있습니다.
public class BlogPost : Entity
{
public DateTime DateModified { get; set; }
public DateTime DatePublished { get; set; }
}
ADO.NET
데이터베이스에서 데이터를 가져 오는 데 사용 ( DateTime.MinValue
값이 없음) :
BlogPost blogPost = new BlogPost();
blogPost.DateModified = sqlDataReader.IsDBNull(0) ? DateTime.MinValue : sqlDataReader.GetFieldValue<DateTime>(0);
blogPost.DatePublished = sqlDataReader.GetFieldValue<DateTime>(1);
DateModified
필드를로 표시하여 두 번째 포인트를 달성 할 수 있습니다 nullable
. 이제 null
값이 없으면 설정할 수 있습니다 .
public DateTime? DateModified { get; set; }
ADO.NET
데이터베이스에서 데이터를 가져 오는 데 사용하면 위에서 수행 한 방식과 약간 다르게 보일 것입니다 ( null
대신에 할당 DateTime.MinValue
).
BlogPost blogPost = new BlogPost();
blogPost.DateModified = sqlDataReader.IsDBNull(0) ? (DateTime?)null : sqlDataReader.GetFieldValue<DateTime>(0);
blogPost.DatePublished = sqlDataReader.GetFieldValue<DateTime>(1);
이것이 혼란을 해결하는 데 도움이되기를 바랍니다. 내 응답이 약 8 년 후에 주어진다면 아마도 C # 프로그래머 일 것입니다 :)