Rodzaje istnieją z jakiegoś powodu, jeśli nie przyniosłyby żadnych korzyści, nie mielibyśmy ich i nie użylibyśmy ich, mielibyśmy po prostu „typ” i wszystko byłoby tak. Są nie tylko wygodne, ale także zwiększają bezpieczeństwo i wydajność. Poniżej znajduje się lista powodów, dla których należy zawsze utrzymywać typy w ich rodzimym formacie, a nie ciągi znaków . Użyłem DateTime
jako przykładu przez większość czasu, ale te same zasady obowiązują dla każdego rodzaju pierwotnego, takiego jak liczby całkowite, dziesiętne, binarne itp.
Magazyn danych
Ograniczenia
Wpisz Ograniczenie
Prawie wszystkie magazyny danych pozwalają określić ograniczenia danych, w tym ograniczenia typu. Jedną z głównych zalet określenia DateTime
instancji jest to, że przechowywane dane będą ograniczone do tego typu. Nigdy nie będzie można wprowadzić niczego poza datą i godziną, niezależnie od tego, jak dane zostały wstawione do sklepu. Ta ostatnia jest ważna w przypadku większych systemów, w których istnieje wiele procesów, które współdziałają bezpośrednio ze sklepem. Obejmuje to również próbę dodania błędnych dat, takich jak 30 lutego (dowolnego roku), ponieważ luty może mieć tylko 29 dni w roku przestępnym i 28 dni w latach przestępnych.
Ograniczenia walidacji
Istnieją również ograniczenia sprawdzania poprawności, które można wdrożyć w magazynie danych, takie jak zapewnienie, że wstawiona data nie przekracza bieżącej daty lub że data początkowa wystąpi przed datą końcową.
Operacje
Większość magazynów danych ma również wbudowane operacje / funkcje, takie jak DateAdd
lub DatePart
w MS Sql Server. Umożliwia to rozpoczęcie filtrowania lub wybierania określonych danych, gdy dane są jeszcze w sklepie (jeszcze nie są pobierane do aplikacji).
Format powszechnie akceptowany
Korzystając z rodzimego typu, inni programiści lub systemy, które również współpracują ze sklepem, nie muszą być informowani o najdrobniejszych szczegółach dotyczących sposobu przechowywania tego pierwotnego typu. Nie dzieje się tak, jeśli ten typ był przechowywany jako ciąg znaków, musisz upewnić się, że wszyscy rozumieją format tego DateTime
ciągu znaków. System ten staje się niestabilny w przypadku danych obejmujących lokalizacje, regiony i kultury pochodzenia danych, fizyczną lokalizację aplikacji oraz atrybuty użytkownika końcowego / systemu, który wchodzi w interakcję z tymi danymi. Przykład: format daty w jednym kraju może być MM / dd / rrrr (jak w USA), ale w innym może być dd / MM / rrrr, wykrycie tej różnicy staje się prawie niemożliwe.
Prędkość
Ważnymi czynnikami są również szybkość pobierania, szybkość sprawdzania poprawności, szybkość operacji i wydajność przechowywania. Przykład prędkości pobierania: magazyny danych pozwalają na indeksy na kolumnach, a indeksy te można ogólnie bardziej efektywnie wykorzystać, jeśli typ jest przechowywany w jego rodzimym formacie.
Podanie
Dostęp do danych
Wykonywanie zapytań w sklepie staje się prostsze przy użyciu natywnego systemu typów, ponieważ programiści po raz kolejny nie muszą zgadywać co do formatu pamięci. Prawie wszyscy dostawcy aplikacji do przechowywania danych ( przykład: ado.net ) zapewniają mechanizmy tworzenia odpowiednich sparametryzowanych zapytań na podstawie przekazywanych typów natywnych. Oto przykład dodania części Data do zapytania ado.net w odniesieniu do sklepu z serwerem Sql, robienie tego samego z łańcuchami byłoby bardzo uciążliwe i kruche / podatne na błędy.
command.Parameters.Add(new SqlParameter("@startDate", SqlDbType.Date) {Value = myDateInstance.Date});
Operacje
Rodzime typy w kodzie zapewniają również standardowe operacje, takie jak typ .net System.Date
. Operacje mają zazwyczaj charakter matematyczny, takie jak dodawanie dat, znajdowanie różnicy między datami itp. Ponownie nie jest to łatwe do wykonania na typach łańcuchów.
Warstwa prezentacji
Widownia
Kiedy typ pierwotny zostanie ostatecznie przekonwertowany na ciąg znaków w warstwie prezentacji ( poprawne położenie stosu programu, aby to zrobić ), programista ma teraz różne opcje poprawnego wyświetlania go zgodnie z kontekstem, w którym jest prezentowany. Ten kontekst ogólnie składa się z rzeczywistego znaczenia danych i ustawień regionalnych użytkownika.
Przykład 1
Instancję daty i godziny można automatycznie sformatować na podstawie ustawień regionalnych użytkownika.
DateTime.Now.ToString("D", CultureInfo.GetCultureInfo(userContext.Culture))
Przykład 2
Wystąpienie dziesiętne może reprezentować kwotę (walutę), a ustawienia regionalne użytkownika powinny również wyświetlać kwotę zgodnie z ich preferencjami. Aplikacja c # może następnie wyświetlić wartość za pomocą
amount.ToString("C", CultureInfo.GetCultureInfo(userContext.Culture))
Może to mieć krytyczne znaczenie, ponieważ różne kultury wyświetlają liczby inaczej. W okresie amerykańskim (.) I przecinek (,) mają dokładnie odwrotne znaczenie jak w Holandii.
Lokalizacja
Jest to bardzo specyficzne dla DateTime
instancji. Data i godzina reprezentują zdarzenie w określonym momencie, ale zwykle musi zostać przekazane / przedstawione użytkownikowi w zależności od jego własnej strefy czasowej. Przykład: DateTime
instancja 2016-09-21T23:38:21.399Z
może być wyświetlana jak 9/21/2016 5:21 PM
dla użytkownika we wschodniej strefie czasowej w USA. Istnieje wiele sposobów osiągnięcia tego celu, ale staje się to prawie niemożliwe, jeśli instancja daty i czasu jest przechowywana w pamięci jako typ łańcucha lub w magazynie danych jako typ łańcucha.
Główna zasada
W przypadku konwersji dowolnego typu pierwotnego na reprezentację łańcuchową obowiązują 2 ogólne zasady aplikacji
- Akceptując dane wejściowe przekonwertuj je na właściwy typ pierwotny tak wcześnie, jak to możliwe na stosie programu (zwykle w warstwie prezentacji)
- Podczas pobierania danych, które mają zostać wyświetlone, przekonwertuj te dane na reprezentację ciągu tak późno, jak to możliwe w stosie programu (ponownie, zwykle w warstwie prezentacji)