2011-12-11 13 views
9

Wiele razy widzę, używając natywnych i literałów "słów kluczowych" w artykułach C#. Co mieli na myśli?Co to są "rodzime" i "dosłowne" słowa kluczowe

przykładów:

string.Empty article:

Pusty stały posiada pustej wartości ciąg. Musimy wywołać konstruktor String , aby kompilator nie oznaczył tego jako literał. Oznaczenie tego jako literalne oznaczałoby, że nie pokazuje się jako pola, do którego możemy uzyskać dostęp z natywnego.

C# vs Java Wikipedia article:

Proste/prymitywne typy
Oba języki wspierać szereg wbudowanych typów, które są kopiowane i przekazywane przez wartość, a nie przez odniesienie. Java nazywa te typy pierwotne, podczas gdy nazywane są one prostymi typami w języku C#. Typy proste/pierwotne zwykle mają natywną architekturę wspierającą od podstawowej architektury procesora.

Odpowiedz

14

od C# sekcji specyfikacji 2.4.4:

dosłownym jest przedstawienie kod źródłowy wartości.

Tak na przykład są literały ciągów i liczb:

string x = "hello"; 
int y = 10; 

... ale C# nie ma dosłownego składnię daty i godziny; trzeba by użyć:

DateTime dt = new DateTime(2011, 12, 11); 

Jak dla natywnego wsparcia - istnieją różne poziomy „natywny” tutaj, ale jeśli chodzi o C# obawia się, bym zazwyczaj uznają to specyficzny dla danego typu wsparcia w jakiejkolwiek wyjścia format jest używany. Na przykład: to instrukcje IL dotyczące radzenia sobie z binarnymi typami zmiennoprzecinkowymi (float, double), ale gdy kompilator C# wyśle ​​kod obsługujący wartości decimal, musi wywołać operatorów zadeklarowanych w System.Decimal. Dlatego uważam, że float inatywne wsparcie w IL, ale nie ma decimal.

(Byłoby możliwe napisanie kompilatora C# kierowania inną platformę, która zrobił posiada natywne wsparcie dla decimal. - lub który nie posiada natywne wsparcie dla float i double, na przykład mało prawdopodobne, ale możliwe.)

Następnie, gdy IL jest uruchamiany w silniku wykonawczym, który będzie działał na wierzchu "prawdziwego" natywnego kodu - na przykład x86 - który może mieć specyficzne wsparcie dla niektórych typów. To kolejny poziom "native". Na przykład, jeśli ktoś wymyślił nową wersję IL, która zawierał natywną obsługę decimal, to nie znaczyłoby, że same procesory nagle uzyskały natywną obsługę.

+0

Czy mógłbyś uprzejmie i zaktualizować wpis z wyjaśnieniem tego zdania zgodnie z odpowiedzią: "Oznaczenie tego jako ** literał ** oznaczałoby, że nie pojawi się jako pole, do którego możemy uzyskać dostęp * * native ** " – gdoron

+2

@gdoron: Nie wiem - to nie ma dla mnie większego sensu, szczerze mówiąc. Uważam, że chodzi o dostęp z kodu natywnego, a nie o obsługę rodzimych typów, ale nie znam szczegółów tego komentarza. –

2

Cytat ze string.Empty art wygląda jak klasyczny przypadek, że komentarze do kodu nie są zsynchronizowane z powiązanym z nimi kodem. Komentarz mówi: "wzywamy konstruktora zamiast używać literału", ale kod nie wywołuje konstruktora: używa literału. Morał tej historii: nie pozwól, by twoje zamieszanie powodowało, że myślałeś, że źle zrozumiałeś, ponieważ komentarz jest mylący.

Istnieje wiele dezinformacji na temat string.Empty, ponieważ jest to trochę dziwne przypadku. Wyrażenie new string() == "" zwykle ma wartość "false", ponieważ oczekuje się, że nowy operator stworzy nowe wystąpienie. Ale nie tworzy nowej instancji, zwraca instancję w puli intern, która jest taka sama jak "", więc wyrażenie jest prawdziwe.

Podejrzewam, że "rodzimy" w "dostęp z natywnego" odnosi się do natywnego kodu (drugie znaczenie "natywnego", o którym wspomniał Jon Skeet). Ale gdybym był tobą, nie spędziłbym zbyt wiele czasu na tym artykule. Jest zbyt zajęty abstrakcyjną teorią, która i tak wydaje się niepoprawna.

Jeśli chcesz wiedzieć, czy string.Empty jest mniej lub bardziej efektywny niż "", skompiluj dwie wersje tej samej funkcji i sprawdź IL. Jeśli IL różni się, przeprowadź testy wydajności.

+0

Dzięki za zbawienie z tego komentarza i artykułu! – gdoron

+0

Komentarz nie jest nieaktualny. Oznacza to, że zostanie wywołany konstruktor CLASS. Inicjowanie pól i właściwości statycznych powoduje niejawne tworzenie konstruktora klasy, który jest automatycznie wywoływany przy pierwszym odwoływaniu się do klasy. – Jesse