Pytanie Czy C # ma zbyt wiele funkcji językowych?


Jest to dyskusja, która pojawia się od czasu do czasu w naszym zespole. Podczas gdy kilka szybko nauczyłem się funkcji C # 3.0, inni trzymają się klasycznych technik.

Niektórzy nigdy nie używają Linq, uważają, że wyrażenia lambda są mylące, a plon jest "przerażający". Czasami trudno jest zrozumieć kod napisany przez ludzi używających wszystkich nowych funkcji. Możemy po prostu powiedzieć, że nie opanowali języka i powinni go nauczyć.

Ale jak trudno jest nauczyć się nowoczesnego języka programowania? Każdy może rozwiązać problemy, każdy ma wiele innych problemów do rozwiązania każdego dnia, niż dbać o lepsze sposoby jego realizacji. Szkolenie ludzi nie jest bezpłatne. Z drugiej strony funkcje językowe mogą sprawić, że ludzie będą bardziej produktywni, a kod stanie się łatwiejszy do utrzymania.

Prawdopodobnie niekompletna lista funkcji C #

  • klasy, struktury, typy pierwotne, tablice, boksowanie, interfejsy, dziedziczenie (abstrakcyjne, wirtualne, nowe, zapieczętowane), właściwości, nullable
  • wyjątki
  • generics
  • wielowątkowość, zamki
  • odbicie
  • delegaci, wydarzenia, anonimowi delegaci
  • iteratory
  • wyrażeń lambda
  • metody rozszerzenia
  • linq

Wersja 4 już wkrótce, w tym wiele dodatkowych funkcji.

Osobiście lubię prawie każdą funkcję C # i lubię krótki i niezły kod, który mogę napisać w tym języku. Ale nie muszę się uczyć od zera.

Jestem zainteresowany twoją opinią i twoim doświadczeniem w nauce lub nauczaniu C #. Czy jest już zbyt wiele funkcji? Czy nadal brakuje ważnych funkcji? Czy funkcje językowe czynią język łatwiejszym w użyciu lub trudniejszym do nauczenia?

Proszę: Brak odpowiedzi, takich jak "Język A jest lepszy niż język B, ponieważ ...".


35
2018-04-28 09:31


pochodzenie


btw: C # 3.0, nie C # 3.5 - Marc Gravell♦
Od faq: unikaj zadawania pytań, które są subiektywne, kłótliwe lub wymagają rozszerzonej dyskusji. . . to jest blisko ode mnie - Binary Worrier
Wersja 4 naprawdę nie ma wielu nowych funkcji: 1) Typ dynamiczny; 2) lepsze wsparcie COM; 3) ogólna wariancja; 4) nazwane / opcjonalne parametry. W porównaniu ze zmianami w 2.0 i 3.0 jest to relatywnie niewielka lista zmian IMO. - Jon Skeet
Spójrz na to pytanie, zapytałem stackoverflow.com/questions/244346/... - Gary Willoughby
IMHO - wszystkie znaki specjalne, słowa kluczowe i magiczne argumenty wyskakujące z nieba sprawiają, że nieczytelny język jest językiem. Mam prawdziwą pracę do wykonania, nie doceniam konieczności uczenia się składni śmieci, ponieważ ktoś próbuje się pochwalić, a język pozwala im zrobić wielki bałagan. Nazywam to "Syntax Rot". - Belmiris


Odpowiedzi:


Tak, jest to ryzyko - i omawia się je los. Dochodzi do punktu, w którym jest bardzo ciężko odebrać C # od zera. Na szczęście sytuacja ustabilizowała się nieco, a zmiany języka między C # 3.0 i C # 4.0 są stosunkowo niewielkie.

Właściwie to ostatnio dużo pracy próbowałem naprawić Problem generycznych CF, a jako część poprawki może się zdarzyć, że kod powróci do technik C # 1.2 (nie, lub bardzo mało, generycznych). Więc większość problemów mogą być adresowane za pomocą prostszych konstrukcji językowych. Chodzi o to: jak trudno jest coś zrobić?

Na przykład - metody anonimowe dodaj LOS korzyści dla stosunkowo niewielkiej złożoności. dynamic (4.0) dodaje trochę więcej dla scenariuszy współpracy między COM. Bloki Iteratora są nieocenione w kodzie stylu LINQ ...

Widzę wiele pytań na temat niebanalnych części C # i myślę, że bym walczył, aby uczyć początkującego wszystko C # od podstaw. Książki takie jak C # J's in Depth są dobre dla ludzi, którzy już znają podstawy (przynajmniej C # 1.2, najlepiej niektóre C # 2.0) - ale tak naprawdę nie jest on przeznaczony dla początkujących (wiem, że Jon nie będzie się z tym nie zgadzał).

Podstępny naprawdę. Na szczęście zespół C # ustawił poprzeczkę (dla włączenia) bardzo wysoko; coś nowego powinno być bardzo przydatny, aby przejść do tego języka.


25
2018-04-28 09:41



jak trudno jest coś zrobić? - Idealnie powinno być łatwo robić rzeczy dobrze, a ciężko robić rzeczy źle ... YMMV - CurtainDog
Teraz zdefiniuj "prawo" i "źle" w kontekście projektowania kodu ... przekonanie programistów jest jak hodowla kotów. - Marc Gravell♦
@Marc: Dziękuję za Twój wkład. Mam nadzieję, że będzie kontynuowana przez społeczność. - Stefan Steinegger
C # jest świetnym językiem z wieloma wspaniałymi funkcjami, jednak dodaje sporo z nich kosztem łatwości. Najbezpieczniejszym wstępem dla nowego dewelopera .NET jest nadal VB.NET, który jest znacznie bardziej opisowy / werbalny niż C #, ale ma wiele takich samych funkcji. Kiedy VB.NET jest dość dobrze zrozumiany, C # może być naprawdę oświecającym językiem - a wzrost wydajności można najlepiej docenić. C # jest w porządku z wysoką barierą wejścia, ale bardziej zaawansowane funkcje mogą zostać zignorowane przez zielonego programistę pod warunkiem, że będą w stanie zrozumieć swój cel i zyski. - STW
@Yoooder - osobiście nie jestem pewien, czy bardziej werbalna składnia będzie miała ogromne znaczenie, ale jesteśmy ... - Marc Gravell♦


Moim zdaniem C # nie ma zbyt wielu funkcji. Niemal każda z nowszych funkcji 2.0 i 3.0 jest z dnia na dzień dla mnie i moich współpracowników, a nawet VB szybko je wszystkie wybrał. Niektóre z nowych funkcji ułatwiają uczenie się języka, np. Za pomocą wbudowanych znaków lambdas zamiast delegatów oraz słowa kluczowego var i inicjalizatorów obiektów, aby wymienić tylko kilka z C # 3.0 (nie ma żadnego C # 3.5, tak na marginesie, jesteś mylący to z .NET 3.5).

C # został w większości przypadków uproszczony, a potężne funkcje są łatwe w użyciu, w przeciwieństwie do C ++, gdzie projektanci mówią, że można zrobić absolutnie wszystko za pomocą C ++, ale nigdy nie wspominają, że wiele rzeczy staje się prawdziwym bólem, który zdarza się ponieważ C ++ może zrobić naprawdę wszystko, w tym wiele rzeczy, których większość programistów rzadko, jeśli w ogóle, używa. Wspieranie wszystkiego oznacza, że ​​wiele rzeczy jest bardziej skomplikowanych niż to konieczne, co utrudnia naukę. Taka jest różnica między językiem, w którym funkcje utrudniają naukę, a jednocześnie bardzo silny i język, w którym funkcje ułatwiają korzystanie i zwiększają wydajność, mimo że są mniej skuteczne w teorii.

I w czystej liczbie funkcji C # jest daleko od C ++, szczególnie jeśli do tego obrazu włączymy C ++ 0x, co ułatwia uczenie się pomimo posiadania "zbyt wielu funkcji" dla niektórych osób. Mój punkt widzenia z C ++ był raczej taki, że C # nie ma tak naprawdę wielu funkcji, jeśli chcesz.


7
2017-11-04 20:10



"Nawet facet VB". . . Stary, chciałbyś to wyjaśnić? - Binary Worrier
BTW: Mój głos jest dla części C ++ twojego argumentu, który jest słabo wyrażony i nie spełnia swojego punktu, imho - Binary Worrier
"Facecik VB" jest programistą, który jest używany do rozwijania w VB, a zatem nie był naprawdę używany do programowania języków nawiasów klamrowych, takich jak C, C ++ lub C #. Ale szybko podniósł C # ze wszystkimi nowymi funkcjami, mimo że pochodził z bardzo odmiennego języka, dlatego jest przykładem, że funkcje w C # nie są zbyt wiele. - OregonGhost
Właściwie, dostaję "różnicę między językiem, w którym funkcje sprawiają, że trudno się nauczyć, ale potężny i język, w którym funkcje ułatwiają korzystanie i poprawiają produktywność" (i zgadzam się), ale ten, który przeplata się "w przeciwieństwie do C ++ , gdzie mówią projektanci ... " i twój wniosek, tak naprawdę nic nie mówi - Binary Worrier
Więc "VB Guy" może równie dobrze być "Guy Delphi", czy "Small Talk Guy", OK. Obawiałem się, że jest to przykład instycyjnego bashowania programistów VB, który zdarza się od czasu do czasu. Jestem zmęczony ludźmi, którzy spoglądają w dół, kiedy mówię, że pracuję z VB (to jest praca). Jestem również facetem w C, C ++, Delphi, C # itd. Dziękuję za wyjaśnienie. - Binary Worrier


Kiedy koduję w C #, używam praktycznie każdej jego funkcji. Nie wszystkie na raz, pamiętajcie, ale każda funkcja C # ma swoje miejsce. Wiele osób nie wie, że C # ma operatora "::" i nigdy nie słyszał o "extern alias", ale musiałem użyć go dzisiaj, aby rozwiązać konflikt nazw między dwiema bibliotekami DLL.

"Powrót plonu" to jedna z moich ulubionych funkcji. Nie używam go każdego dnia, ale kiedyś pisałem interfejsy IEnumerator ręcznie w C # 1.0 i był to ogromny ból, którego raczej nie powtórzę. Poza tym jest to naprawdę przydatne do pisania coroutines, nawet coroutines, które nie generują żadnych wyników (yield return null = wstrzymaj operację).

C # ma wewnętrzne funkcje i zamknięcia. Kiedy koduję w C ++, są one bardzo pomijane.

Wydaje się głupie, że C # ma tak wiele różnych sposobów pisania funkcji wewnętrznej,

  1. delegate(int x) { return x*x; }
  2. x => x*x
  3. (int x) => { return x*x; }

Ale # 1 jest tylko ze względów historycznych, a formularze 2 i 3 mają swoje miejsce.

Niezależnie od tego, czy chodzi o metody rozszerzania, przeciążanie operatorów, generics, ogólne ograniczenia, parametry domyślne, koalescencja null, operator potrójny, konstruktory statyczne, zaznaczone / niezaznaczone, auto-właściwości, dyrektywy preprocesora, typy wartości ... jako programista w pełnym wymiarze czasu Używam wszystkich co najmniej od czasu do czasu i wyeliminowanie którejkolwiek z tych funkcji albo powoduje dodatkową pracę i zaostrzenie mnie (foo(x) ?? bar(y) teraz musi być napisane { var temp = foo(x); if (temp == null) temp = bar(y) }) lub wymaga napisania grubszego / wolniejszego kodu (np. jeśli zastąpisz typy wartości klasami, niektóre z nich spowolnią, a użycie pamięci znacznie wzrośnie).

Daleko od posiadania zbyt wielu funkcji, myślę, że to nie wystarczy. Za każdym razem, gdy muszę napisać podobny kod w kółko, przeklinam język za brak skrótu.

Sztuczka polega na tym, że programiści, którzy nie pracują w pełnym wymiarze czasu, mogą to zrozumieć. (jak w przypadku osób, które programują w języku C # w pełnym wymiarze godzin i nadal nie mogą uczyć się języka - um, odpalić je?) Mogłoby to pomóc, gdyby Microsoft wprowadził funkcje "Googlable" lub przynajmniej "F1-able". Na przykład, gdy umieściłem kursor na "??" lub "=>" i naciśnij F1, powinienem dostać stronę pomocy dla tych operatorów. Lub rozważ statyczne konstruktory: jeśli kod powiedział "static constructor ()" zamiast "static MyClassName ()", łatwiej byłoby go wyszukać w Internecie.

IMO, większy problem niż nadużywanie języka to nadpis w strukturze. Platforma .NET jest gigantyczna, a Microsoft ponownie wykonuje te same czynności wielokrotnie, tworząc za każdym razem nadęty, wadliwy projekt: WinForm i WPF, różne sposoby dostępu do bazy danych itp.


5
2018-04-28 09:47





Prawdopodobnie powinieneś przeczytać ten wpis na blogu Eric Gunnerson, członek zespołu kompilatora C # w Microsoft.

Wyjaśnia, w jaki sposób nowe funkcje wprowadzają język. Zasadniczo uzyskują one "-100 punktów" na początku ", co oznacza, że ​​musi on mieć znaczny pozytywny wpływ netto na cały pakiet, aby stał się językiem."


2
2018-04-28 09:52





W rzeczywistości jest dużo debaty na temat ewolucji C #. W rzeczy samej, niektórzy uważają, że dodając wiele nowych funkcji, język staje się trudny do nauczenia, ale większość postrzega język C # jako język programowania wielu paradygmatów. Jest to przede wszystkim mocno napisany, w pełni funkcjonalny język obiektowy, ale ma koncepcje, które do niedawna ograniczały się do funkcjonalnych i dynamicznych języków programowania. Funkcje te, choć mogą wydawać się kłopotliwe dla początkujących, oferują dużą elastyczność i moc, a czasem mogą okazać się wystarczające, aby uniemożliwić korzystanie z języka specyficznego dla danej domeny w aplikacji i rozwiązywanie wszystkich problemów związanych z integracją. Zawsze możesz porozmawiać o tym, co powinno zostać zaimplementowane w samym języku i co powinno być częścią struktury, ale pamiętaj, że większość funkcji, które wymieniłeś i uznasz za zbędne, jest w rzeczywistości wynikiem żądań programistów, i robią to. zapewniają funkcjonalność, która odróżnia C # od innych języków (Java przychodzi na myśl). Gdy programista skorzysta z tych funkcji, zrozumie ich zalety.

Wspomniałeś o Linq i muszę przyznać, że początkowo byłem trochę sceptyczny, ponieważ zawsze uważałem SQL za dość naturalny język do pracy z danymi, ale teraz bardzo lubię i widzę zaletę posiadania zapytań ocenianych na czas kompilacji. Wyrażenia lambdy są zawsze miłe, w rzeczywistości mogą sprawić, że kod będzie trudny do odczytania, jeśli użyje się go nadmiernie, ale czasami faktycznie go upraszcza. Nie jestem wielkim fanem słowa kluczowego "var", ale czasami przydaje się on, i bądźmy szczerzy, nie używając go, gdy pisanie Linq sprawiłoby, że kod byłby trudny do odczytania. Sam jestem programistą początkującym i nie sądzę, że trudno jest nauczyć się tych pojęć. Używam również Java w szkole, a ja naprawdę brakuje niektórych funkcji C # (Nie mówię, że Java jest złym językiem, wręcz przeciwnie, w niektórych sprawach Myślę, że jest to lepsze niż C # - umowy kodu, zwłaszcza dla celów akademickich).


2
2018-04-28 10:17



Nie uważałem niczego za zbędne. - Stefan Steinegger
Masz na myśli, że Java ma umowy na kod na poziomie językowym, czy jest to funkcja ramowa? - Rafa Castaneda


Nie wydaje mi się, że uczenie się nowych funkcji językowych jest tym, czym należy się martwić: poznanie właściwych sytuacji, w których można je zastosować, zajmuje dziesięciolecia.

Czasami trudno je zrozumieć   kod napisany przez osoby używające   wszystkie nowe funkcje.

To jest prawdziwy problem, który musisz rozwiązać. Podstawa kodu, podzielona na różne style i niedostępna dla wszystkich, jest kosztowną podstawą kodu do utrzymania. Użycie nowatorskich funkcji do napisania "krótkiego i ładnego kodu" może nie zmaksymalizować użyteczności tego kodu dla twojej organizacji.

Jaka jest przyczyna twojej sytuacji? Czy to:

  • Niektórzy programiści nie rozumieją nowych funkcji
  • Nowe funkcje zostały niewłaściwie użyte
  • Nowe funkcje zostały wykorzystane do zhakowania wokół wad projektowych (często w przypadku odbicia)

Założę się, że pieniądze będą mieszanką powyższych.


2
2018-01-24 01:14



Nie chodzi o to, że mamy duży problem. Ale typowa sytuacja polega na tym, że pytam kogoś, dlaczego nie korzysta z nowego interfejsu RhinoMocks i otrzymuję odpowiedź "Och, używa tej dziwnej strzałki". Z dnia na dzień robi się coraz lepiej, ale wciąż są inne rzeczy do nauczenia się. - Stefan Steinegger
@Stefan: Co jest nie tak z nauką? - John Saunders
@John: Uczenie się jest genialne. Jako programista chcę codziennie uczyć się nowych funkcji języka / wzorców / zapachów kodu. Ale z biznesowego punktu widzenia rzeczy może być innym. Na przykład. w środowisku kodowania z wysokimi obrotami i ubogimi programistami prawdopodobnie będziesz chciał zachować ekskluzywne funkcje do niezbędnego minimum i upewnić się, że wszyscy przestrzegają rygorystycznych standardów kodowania. Wszystko jest kompromisem. - Alex
@John + @Alex, dzięki za odpowiedź na moje pytanie, Alex :-) Nie ma nic złego w nauce. Ale język programowania nie powinien kończyć się sam w sobie. Nie nauczysz się go tylko opanować, ale rozwiązać problemy biznesowe. Wielu programistów pracuje w złożonym środowisku, a ich praca tylko częściowo polega na pisaniu kodu. Muszą znać biznes, na przykład logistykę, chemię, politykę, finanse itp. Muszą też nauczyć się wielu narzędzi. Ludzki mózg jest ograniczony. Innymi słowy: są inne, prawdopodobnie ważniejsze rzeczy do nauczenia się. - Stefan Steinegger
Język, z definicji, jest środkiem komunikacji. Skuteczna komunikacja oznacza utrzymanie jej w jak najprostszy sposób, aby większość ludzi mogła zrozumieć, co mówisz. Szalone postacie specjalne i inne nieintuicyjne elementy utrudniają komunikację. Chodzi mi o to, że nawet kod nie jest zwykle bardziej zwięzły. Co więcej, prawie zawsze utrudnia to działanie. Wiem, wiem, jesteś fajny, ponieważ lubisz złożoność i spędzasz czas na rozwijaniu węzłów gordyjskich, ale jest wystarczająco dużo nowych rzeczy do nauczenia się bez tworzenia skomplikowanych sposobów robienia prostych rzeczy. - Belmiris


Czy trudno jest nauczyć się nowoczesnego języka programowania?

Do: najlepiej chcesz użyć najpotężniejszego języka, jaki możesz, dzięki czemu możesz wyrazić wszystko poprawnie.

Przeciw: chcesz myśleć o problemie, a nie o tym, jak działa ten język.

Ogólnie rzecz biorąc: jestem na bardziej zaawansowanych językach, nawet jeśli są one trudniejsze. Czuję się zirytowany, gdy nie mogę sprawić, by język zrobił to, czego potrzebuję, więc muszę obejść go lub zmienić w inny głupi wzór. Nie mam nic przeciwko uruchomianiu się z jakąś dziwną nową składnią, ponieważ internet jest tylko o kliknięcie.

Edytowane dodatkowe myśli: Jestem za próbą utrzymania spójnej / logicznej składni podczas dodawania funkcji do języka, ale nie jest to właściwy wątek do dyskusji na lisp.

Czy istnieją funkcje, których C # powinno się pozbyć?

Dużo korzystam z nowych funkcji, takich jak LINQ, metody rozszerzeń, var (właśnie napisałem typ, dlaczego piszę go ponownie?) I anonimowe funkcje. Zauważyłem, że mogą przynieść całkiem spore korzyści w zakresie wydajności. Poleciłbym każdemu, kto nie miałby do czynienia z LINQ, ale jeszcze trochę czasu, aby nauczyć się Linq-to-Objects, ponieważ jest to niezwykle wygodne za każdym razem, gdy masz ustaloną logikę.

Nie podoba mi się jednak szczególnie specjalna składnia LINQ podobna do SQL. Uważam, że jest to trochę szarpane w środku kodu C # - według mnie koliduje to z metodą obiektową wywołującą styl składni. byłbym bardziej zadowoleni z bardziej powszechnej składni rozumienia listy, takiej jak używana w np. Pyton.

Czy są nowe funkcje, których potrzebuje C #?

Naprawdę chciałbym trochę lepszej składni do szybkiego inicjowania tablic (a może IEnumerables?) I słowników. C # jest trochę nieporęczny pod tym względem - w końcu muszę wypisać wiele nawiasów klamrowych. W związku z tym naprawdę brakuje mi wydajności! (wydaj każdą pozycję w tej kolekcji) składnię.

Chciałbym również C # wypożyczyć poprawione wnioskowanie typu F # i być może jego krotki i wielokrotne przypisanie. Może powinienem po prostu użyć F #.


1
2018-04-28 09:55





Chociaż jestem tylko zwykłym użytkownikiem C #; z silnym zapleczem w Delphi, C ++ i Pythonie; Potrafię dość łatwo zrozumieć koncepcję C #. C # jest według mnie odpowiednio zbalansowanym językiem. Jedyną irytacją jest to, że ledwie pamiętam wystarczająco dużo składni (zwłaszcza Linq) w mojej głowie, by stworzyć kod w tempie pisania na klawiaturze tak jak mogę w Pythonie. Moje preferencje w stosunku do składni paskal może również przeszkadzać mi. Jednak przy pomocy wszechmocnego Visual Studio.NET Express nie stanowi to żadnego problemu.

Tak długo, jak zapewniają one tak niesamowite narzędzie za darmo, uważam, że C # z VS.NET jest jednym z najlepszych dostępnych środowisk kodowania.


0
2018-04-28 10:14





Ja też lubię większość nowych funkcji i całkiem szczerze nie chcę stracić metod rozszerzenia i linq w ogóle.

Jeśli chodzi o łatwość nauki, to myślę, że problem ten stanowi większy problem dla początkujących - a z doświadczenia wynika, że ​​szybkie awansowanie jest zdecydowanie kwestią wyboru największych wygranych i pomagania im, gdy natkną się na coś innego. . Oprócz wielowątkowości zrozumienie generyków wydaje się być kluczem do uzyskania korzyści z innych funkcji.

Każda dodatkowa funkcja zdecydowanie przynosi dodatkowe korzyści. W końcu pojawią się nowe języki, które ułatwiają korzystanie z tych samych funkcji, ale to w żaden sposób nie oznacza, że ​​nie powinniśmy ulepszać tych, które mamy teraz.


0
2018-04-28 11:00