C # rzutowanie i analizowanie


Który z poniższych jest najlepszym kodem do użycia w języku C # i dlaczego?
((DateTime)g[0]["MyUntypedDateField"]).ToShortDateString()

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

Ostatecznie, co lepiej wyrzucić lub rozebrać?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jeśli g [0] ["MyUntypedDateField"] jest rzeczywiście obiektem DateTime, to rzutowanie jest najlepszym wyborem. Jeśli w rzeczywistości nie jest to DateTime, nie masz innego wyjścia, jak go przeanalizować (otrzymasz InvalidCastException, jeśli spróbujesz rzutować)
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Casting jest

tylko

dobra odpowiedź.
Należy pamiętać, że wyniki ToString i Parse nie zawsze są dokładne - zdarzają się sytuacje, w których nie można bezpiecznie nawigować między tymi dwiema funkcjami.
Dokumentacja ToString mówi, że używa bieżących ustawień kultury strumienia. Dokumentacja Parse mówi, że używa również bieżących ustawień kultury przepływu (tak dobre jak dotąd - używają tej samej kultury), ale istnieje wyraźna uwaga, że:

Na formatowanie mają wpływ właściwości bieżącego obiektu DateTimeFormatInfo, które domyślnie pochodzą z opcji regionalnych i językowych w Panelu sterowania.

Jednym z powodów, dla których metoda Parse może nieoczekiwanie zgłosić FormatException, jest to, że bieżące właściwości DateTimeFormatInfo.DateSeparator i DateTimeFormatInfo.TimeSeparator mają tę samą wartość.
Tak więc, w zależności od preferencji użytkownika, kod ToString/Parse może nieoczekiwanie ulec awarii ...
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Twój kod zakłada, że ​​zmienna może być datą lub ciągiem, który wygląda jak data. Możesz po prostu zwrócić daty za pomocą rzutowania, ale ciągi muszą zostać przeanalizowane. Analiza zawiera dwa zastrzeżenia;
  • jeśli nie masz pewności, czy ten ciąg można przeanalizować, użyj metody
    DateTime.TryParse ()
    .
  • Zawsze dołączaj odwołanie do kultury, którą chcesz przeanalizować jako.
    ToShortDateString ()
    zwraca różne wyniki w różnych miejscach. Prawie na pewno będziesz chciał przeanalizować przy użyciu tej samej kultury. Proponuję tę funkcję, która dotyczy obu sytuacji;
    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 parseResu< if (DateTime.TryParse(dateString, CultureInfo.CurrentCulture, DateTimeStyles.AssumeLocal, out parseResult)) { return parseResu< } 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"); }}

Więc zadzwoń w ten sposób;
ParseDateTime(g[0]["MyUntypedDateField").ToShortDateString();

Zauważ, że złe dane generują wyjątek, więc będziesz chciał je złapać.
Ponadto operator „as” nie działa z typem danych DateTime, ponieważ działa tylko z typami referencyjnymi, a DateTime jest typem wartości.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jak zauważył @Brian R. Bondi, jest to zależne od implementacji

g[0]["MyUntypedDateField"]
... Bezpieczną praktyką jest używanie

DateTime.TryParse

i w

jakość

operator.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Parsowanie wymaga ciągu znaków wejściowych, rzutowanie wymaga obiektu, więc w drugim przykładzie powyżej musisz wykonać dwa rzutowania: jedno z obiektu na ciąg, a następnie ze ciągu na DateTime. Pierwszy nie.
Jeśli jednak istnieje ryzyko wyrzucenia wyjątku podczas rzucania, możesz wybrać drugą drogę, aby uniknąć kosztownych wyjątków. W przeciwnym razie przejdź do najbardziej wydajnej trasy i po prostu rzuć raz (obiekt do DateTime), a nie dwa razy (obiekt do ciągu do DateTime).

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się