DateTime 변수에 값이 지정되어 있는지 확인


131

C # 내에서 DateTime 인스턴스에 값이 할당되었는지 확인하는 쉬운 방법이 있습니까?

답변:


83

C #에 값이 할당되지 않은 변수를 갖는 유일한 방법은 변수가 로컬 변수가되는 것입니다.이 경우 컴파일 타임에 변수를 읽으려고 시도하여 변수가 지정되지 않았다는 것을 알 수 있습니다. )

나는 당신이 정말로 원한다고 생각합니다 Nullable<DateTime>(또는 DateTime?C # 구문 설탕으로)-그것을 null시작한 다음 정상적인 DateTime값 을 지정하십시오 (적절하게 변환 될 것입니다). 그런 다음 "실제"값이 설정되어 있는지 확인 null하기 위해 HasValue속성을 사용하거나 비교할 수 있습니다 .


값이 기본 날짜 시간 값과 같은지 확인하는 방법은 무엇입니까? 이 접근법에 눈에 띄지 않는 단점이 있습니까? if (request.StartDateTime == default (DateTime) {request.StartDateTime = DateTime.Now;}
Menol 2016 년

8
@Menol : 고의적으로 가치를 부여받은 분야 default(DateTime)와 처음부터 그런 방식으로 이루어진 분야의 차이를 알려주지 않습니다 . 기본적으로 도메인 내에서 하나의 값을 "특별하고 정상적인 사용에는 사용할 수 없음"으로 취급하고 있습니다.
Jon Skeet

298

당신은 그렇게 의미합니까?

DateTime datetime = new DateTime();

if (datetime == DateTime.MinValue)
{
    //unassigned
}

또는 Nullable을 사용할 수 있습니다

DateTime? datetime = null;

 if (!datetime.HasValue)
 {
     //unassigned
 }

5
이 중 두 번째 만 방탄입니다. 첫 번째는 프레임 워크에서 보장하지 않는 DateTime의 설정되지 않은 표현에 대해 가정합니다. 개인적으로 나는이 시나리오에 대해 Unset 정적 멤버를 추가해야한다고 생각합니다.
Rupert Rawnsley

18
@RupertRawnsley가 말한 것을 추가하려면 실제로 할당되지 않은 DateTime의 값 인 default (DateTime)와 비교해야합니다. MinValue와 동일하지만 변경 될 수 있습니다.
Tsahi Asher

32

이것을 어딘가에 넣으십시오 :

public static class DateTimeUtil //or whatever name
{
    public static bool IsEmpty(this DateTime dateTime)
    {
        return dateTime == default(DateTime);
    }
}

그때:

DateTime datetime = ...;

if (datetime.IsEmpty())
{
    //unassigned
}

이 아이디어가 마음에 들지만 DateTime 변수에 기본값이되는 값이 할당되지 않은 경우이 확장 메서드는 잘못된 결과를 반환합니다. 이것을 피하는 유일한 방법은 이미 제안 된 nullable DateTime을 사용하는 것입니다. 그래도 나는 여전히 당신의 대답을 정말로 좋아합니다 (감사합니다)!
Klicker

@ Klicker : 좋은 의견 감사합니다,하지만 나는 당신의 말을 이해 잘 모르겠습니다. 이 경우 ==에 말할 수있는 한 datetime이 default (DateTime)와 같으면 datetime end-up에 기본값이 할당되는 방식에 관계없이 항상 true를 반환합니다. 설명하겠습니다 : 실제로 내 대답의 두 번째 스 니펫이 잘못되었습니다. 컴파일하지 않습니다. 왜냐하면 이것이 함수의 본문이라고 생각하면 날짜 시간이 할당되지 않고 컴파일러가 사용을 거부하기 때문입니다. 따라서 값을 할당해야합니다. 직접 또는 간접적으로 default (DateTime) 일 수 있습니다. 답변을 수정하겠습니다.
sonatique

다른 컨텍스트에서 datetime이 클래스의 멤버이고 그대로 유지되면 런타임은 default (DateTime)를 클래스에 할당합니다. 구조체의 ==는 구조체가이 컨텐트로 채워지는 방식에 관계없이 구조체의 컨텐트를 실제로 비교합니다.
sonatique

나의 요점은 단지 반원들과 만 관련이 있으며, 내가 의미하는 것은; 클래스 수준의 DateTime 필드 또는 MinValue를 할당 한 속성이있는 경우 IsEmpty메서드가 true를 반환합니다.이 값은 비어 있지 않기 때문에 원하는 값 이 아닐 수 있습니다. 기본값이 할당되었습니다. 나는 당신의 방법의 이름이로 더 적합하다고 생각 IsDefaultValue합니다. nullable이 아닌 DateTime을 실제로 가질 수는 없습니다 IsEmpty.
Klicker

@ Klicker : 아 그래, 알았어. 당신 말이 맞아요 : 내가 선택한 이름이 잘못되었습니다. IsDefaultValue더 좋았을 것입니다
sonatique

5

DateTime은 값 형식이므로 절대 null 일 수 없습니다. DateTime을 생각하십니까? (Nullable)을 사용할 수 있습니다 :

DateTime? something = GetDateTime();
bool isNull = (something == null);
bool isNull2 = !something.HasValue;

5

할당되지 않은 날짜 시간에 대한 GetHashCode ()가 항상 0이라는 것을 알았습니다. 이 동작이 표시되는 이유에 대한 문서를 찾을 수 없기 때문에 이것이 null 날짜 시간을 확인하는 좋은 방법인지 확실하지 않습니다.

if(dt.GetHashCode()==0)
{
    Console.WriteLine("DateTime is unassigned"); 
} 

1
GetHashCode눈금으로 인해 0을 반환합니다 (DateTime의 내부 표현)도 0과 같습니다 unchecked((int)ticks) ^ (int)(ticks >> 32);. 해시 코드는 다음과 같은 방법으로 계산됩니다 . 참조 : referencesource.microsoft.com/#mscorlib/system/datetime.cs,836
Ivan Kochurkin

대단히 감사합니다. C # 클래스에서 XML 파일을 직렬화하고 null 속성을 제외하려고합니다. 도움이되었습니다.
Jim Neff


3

기본값은 항상 new DateTime()입니다. 그래서 우리는 쓸 수 있습니다

DateTime datetime;

if (datetime == new DateTime())
{
    //unassigned
}

2
이 솔루션은 이미 2008 년 + Hath에 의해 제공되었으며, + Rupert Rawnsley가 논평으로 추가 한 것처럼, 방탄하지는 않습니다 ...
Roland Bär

0

일반적으로 가능한 경우 값 유형의 기본값을 사용하여 설정 여부를 결정하는 것이 좋습니다. 이것은 항상 int에서 항상 가능하지는 않습니다.하지만 DateTimes의 경우 MinValue를 예약하여 변경되지 않았 음을 나타냅니다. nullables에 비해 이것의 장점은 null 참조 예외를 얻을 수있는 곳이 적다는 것입니다 (그리고 액세스하기 전에 null을 확인할 필요가없는 곳이 많을 것입니다!)


0

null을 사용할 때마다 null을 확인하거나 일부 논리로 래핑하는 것과 같은 Null 값 문제에 대해 걱정할 필요가없고 오프셋 시간 문제에 대해 걱정할 필요가 없으면 다음과 같습니다. 어떻게 문제를 해결 했습니까?

startDate = startDate < DateTime.MinValue.AddDays(1) ? keepIt : resetIt

기본값이 시작 후 하루보다 작은 지 확인합니다. 매력처럼 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.