문제

다음 중 C#에서 더 나은 코드는 무엇이며 그 이유는 무엇입니까?

((DateTime)g[0]["MyUntypedDateField"]).ToShortDateString()

또는

DateTime.Parse(g[0]["MyUntypedDateField"].ToString()).ToShortDateString()

궁극적으로 캐스팅하는 것이 더 낫습니까, 아니면 파싱하는 것이 더 낫습니까?

도움이 되었습니까?

해결책

g[0]["MyUntypedDateField"]가 실제로 DateTime 객체라면 캐스트가 더 나은 선택입니다.실제로 DateTime이 아닌 경우 Parse를 사용할 수밖에 없습니다(캐스트를 사용하려고 하면 InvalidCastException이 발생합니다).

다른 팁

캐스팅은 오직 좋은 대답.

ToString 및 Parse 결과가 항상 정확한 것은 아니라는 점을 기억해야 합니다. 두 함수 간에 안전하게 왕복할 수 없는 경우가 있습니다.

ToString 문서에 따르면 현재 스레드 문화 설정을 사용합니다.Parse 문서에 따르면 현재 스레드 문화 설정도 사용한다고 나와 있지만(지금까지는 매우 좋습니다. 동일한 문화권을 사용하고 있습니다) 다음과 같은 명시적인 설명이 있습니다.

형식은 기본적으로 제어판의 국가 및 언어 옵션 항목에서 파생되는 현재 DateTimeFormatInfo 개체의 속성에 의해 영향을 받습니다. Parse 메서드가 예기치 않게 FormatException을 발생시킬 수 있는 한 가지 이유는 현재 DateTimeFormatInfo.DateSeparator 및 DateTimeFormatInfo.TimeSeparator 속성이 동일한 값으로 설정된 경우입니다.

따라서 사용자 설정에 따라 ToString/Parse 코드가 예기치 않게 실패할 수도 있고 실패할 수도 있습니다.

코드에서는 변수가 날짜이거나 날짜처럼 보이는 문자열일 수 있음을 제안합니다.날짜는 캐스트를 사용하여 간단히 반환할 수 있지만 문자열은 구문 분석해야 합니다.구문 분석에는 두 가지 주의 사항이 있습니다.

  1. 이 문자열을 구문 분석할 수 있는지 확실하지 않은 경우 다음을 사용하세요. DateTime.TryParse().

  2. 항상 구문 분석하려는 문화권에 대한 참조를 포함하세요. ToShortDateString() 다른 위치에서 다른 출력을 반환합니다.거의 확실히 동일한 문화권을 사용하여 구문 분석하고 싶을 것입니다.나는 두 가지 상황을 모두 다루는 이 기능을 제안합니다.

    private DateTime ParseDateTime(object data)
    {
        if (data is DateTime)
        {
            // already a date-time.
            return (DateTime)data;
        }
        else if (data is string)
        {
            // it's a local-format string.
            string dateString = (string)data;
            DateTime parseResult;
            if (DateTime.TryParse(dateString, CultureInfo.CurrentCulture,
                                  DateTimeStyles.AssumeLocal, out parseResult))
            {
                return parseResult;
            }
            else
            {
                throw new ArgumentOutOfRangeException("data", 
                                   "could not parse this datetime:" + data);
            }
        }
        else
        {
            // it's neither a DateTime or a string; that's a problem.
            throw new ArgumentOutOfRangeException("data", 
                                  "could not understand data of this type");
        }
    }
    

그럼 이렇게 전화하세요.

ParseDateTime(g[0]["MyUntypedDateField").ToShortDateString();

잘못된 데이터는 예외를 발생시키므로 이를 포착하는 것이 좋습니다.

또한;'as' 연산자는 DateTime 데이터 유형에서는 작동하지 않습니다. 이는 참조 유형에서만 작동하고 DateTime은 값 유형이기 때문입니다.

@Brian R.Bondy는 이것이 구현에 달려 있다고 지적했습니다. g[0]["MyUntypedDateField"].안전한 습관을 사용하는 것입니다 DateTime.TryParse 그리고 ~처럼 운영자.

구문 분석에는 입력을 위한 문자열이 필요하고 캐스팅에는 개체가 필요하므로 위에서 제공한 두 번째 예에서는 두 번의 캐스팅을 수행해야 합니다.하나는 객체에서 문자열로, 그런 다음 문자열에서 DateTime으로.첫 번째는 그렇지 않습니다.

그러나 캐스팅을 수행할 때 예외가 발생할 위험이 있는 경우 TryParse를 수행하고 비용이 많이 드는 예외가 발생하는 것을 방지할 수 있도록 두 번째 경로로 이동하는 것이 좋습니다.그렇지 않으면 가장 효율적인 경로로 이동하여 두 번(객체에서 문자열, DateTime으로) 캐스팅하는 대신 한 번(객체에서 DateTime으로) 캐스팅하면 됩니다.

다양한 기술을 비교하고 있습니다. http://blogs.msdn.com/bclteam/archive/2005/02/11/371436.aspx.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top