Obecnie mam WebSocket między JavaScript a serwerem zaprogramowanym w C #. W JavaScript mogę łatwo przekazywać dane za pomocą tablicy asocjacyjnej:
var data = {'test': 'val',
'test2': 'val2'};
Aby przedstawić ten obiekt danych po stronie serwera, używam Dictionary<string, string>
, ale jest to bardziej „kosztowne pisanie” niż w JavaScript:
Dictionary<string, string> data = new Dictionary<string,string>();
data.Add("test", "val");
data.Add("test2", "val2");
Czy istnieje jakiś dosłowny zapis dla tablic asocjacyjnych Dictionary
w C #?
c#
dictionary
literals
pimvdb
źródło
źródło
Odpowiedzi:
Używasz składni inicjalizującej kolekcję , ale nadal musisz
new Dictionary<string, string>
najpierw utworzyć obiekt, ponieważ składnia skrótu jest tłumaczona na kilkaAdd()
wywołań (takich jak kod):W C # 6 masz teraz możliwość użycia bardziej intuicyjnej składni ze słownikiem, a także dowolnego innego typu, który obsługuje indeksatory . Powyższe oświadczenie można przepisać jako:
W przeciwieństwie do inicjatorów kolekcji, wywołuje to narzędzie ustawiające indeksowanie pod maską, a nie odpowiednią
Add()
metodę.źródło
Dictionary<string, string>
? Wydaje się raczej zbędny, ale mogę się mylić. Edycja: To naprawdę wydaje się bardziej preferowany sposób, dziękuję.var
, kompilator wyprowadzi typ znew
. Zredagowałem swoją odpowiedź.Dictionary<string, string>
. Mój kod pierwotnie zadeklarował typ, właśnie go zmieniłem navar
jego komentarz.Chociaż odpowiedź inicjalizująca słownik jest całkowicie poprawna, istnieje inne podejście do tego, na które chciałbym zwrócić uwagę (ale może nie polecam). Jeśli Twoim celem jest zapewnienie zwięzłego użycia interfejsu API, możesz użyć obiektów anonimowych.
Zmienna „data” jest wtedy „niewymownym” typem anonimowym, więc można ją przekazywać tylko jako
System.Object
. Następnie możesz napisać kod, który może przekształcić anonimowy obiekt w słownik. Taki kod opierałby się na refleksji, która potencjalnie byłaby powolna. Możesz jednak użyćSystem.Reflection.Emit
lubSystem.Linq.Expressions
skompilować i buforować delegata, który znacznie szybciej wykona kolejne połączenia.Interfejsy API Asp.net MVC wykorzystują tę technikę w wielu miejscach, które widziałem. Wiele pomocników HTML ma przeciążenia, które akceptują albo obiekt, albo słownik. Zakładam, że cel ich interfejsu API jest taki sam, jak tego, czego szukasz; krótka składnia w wywołaniu metody.
źródło
Korzystanie
DynamicObject
z prostszego inicjatora słownika nie jest trudne.Wyobraź sobie, że chcesz wywołać następującą metodę
używając dosłownej składni, takiej jak
Można to osiągnąć, tworząc taki dynamiczny obiekt
źródło
Użyj literału słownika (propozycja C # 9)
C # 9 wprowadza prostszą składnię do tworzenia zainicjowanych
Dictionary<TKey,TValue>
obiektów bez konieczności określania nazwy typu Dictionary lub parametrów typu. Parametry typu dla słownika są wywnioskowane przy użyciu istniejących reguł używanych do wnioskowania o typie tablicy.Ta składnia upraszcza pracę ze słownikami w języku C # i usuwanie zbędnego kodu.
Możesz śledzić ten problem na GitHub (a oto kamień milowy dla C # 9 ).
Edycja: ta propozycja jest obecnie odrzucona :
źródło