Jakie wady ma C# i .NET?

2

Ktoś tu kiedyś napisał, że jak się jest profesjonalistą, to zna się nie tylko zalety, ale też wady swojej technologii. Dlatego na rozmowach rekrutacyjnych zadaje pytania typu Co się Panu nie podoba w technologii/języku X? No właśnie, co byście odpowiedzieli, jakbyście dostali takie pytanie? Mi do głowy przychodzi jedynie niepotrzebny query syntax, obecność ref i out. Przydałyby się też w bibliotece standardowej klasy typu Result, Either, Option, żeby nie trzeba było ich przy każdym projekcie samemu pisać albo importować jakichś wielkich bibliotek. Co jeszcze? Czego brakuje C# i dotnetowi?

2

.NETowi uważam że brakuje dojrzałego frameworka do crossplatformowego GUI. Avalonia chyba jeszcze raczkuje?

A w C# chyba tylko bym się czepiał do konstrukcji, które na dzisiejsze standardy są "nieładne", ale z oczywistych powodów muszą zostać, oraz idzie się łatwo wkopać przy lambda variable capture local vs outer @neves

var a = "a";
Action action = () => Console.WriteLine(a);

Action action2 = () => 
{
	var b = "b";
	Console.WriteLine(b); 
	action(); 
	b = "c"; 
};

a = "b";

action();
action2();

co się stanie?

I czasem czuję, że chciałbym aby dało się sprawdzić jakie wyjątki np. metoda jest w stanie rzucić lub żeby ValueTuple były serializowalne.

Ogólnie uważam, że sam język jest ekspresywny oraz w miarę zwięzły, chociaż czasem chciałbym mieć jakiś wymyślny syntax typu: var a = GetData() ?? return 0;

edit. ForEach działa tylko na listach i trzeba hackować coś typu: .Where(x => { (...) return true;})

1

W temacie posta jest pytanie na temat C#, a odpowiedzi są głównie na temat .NET :D

@WeiXiao
Może kiedyś dojdzie do momentu gdzie .NET Core będzie wspierał WinForms na innych systemach niż Windows. Mnie jakoś "multiplatformowości" nie brakuje, bo akurat wdrażam systemy, które działają tylko na Windows.

Zgadzam się z @nobody01 - query syntax jest paskudne. Czepiłbym się wyjątków, a szczególnie jednego

Object reference not set to an instance of an object

Chciałbym, żeby było coś więcej. Jakoś wyświetlanie całego stacktrace użytkownikowi mi się nie widzi, a przecież jesteśmy ludźmi, każdy może coś przeoczyć w kodzie.

1

Skoro zostałem wywołany do tablicy to coś zarzucę :) Wadą .NETa jest to, że programiści bawią się w jakieś ręczne optymalizacje zamiast mieć porządnego JITa. Stąd np awersja do virtual, zastanawianie się czy użyć foreacha czy może fora z indeksowaniem, itp itd Tymczasem np już w Javie 6 Update 24 (2011 rok) włączono automatyczne Escape Analysis jako dodatek do silnej dewirtualizacji mającej początek w Javie 1.3. Efekty można obejrzeć tutaj.

Albo skopiuję tutaj dla widoczności:

Kod Javowy:

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;

interface Function<T> {
    long perform(T parameter, long x);
}

class MyArray<T> {

    T[] array;
    long x;

    public MyArray(int size, Class<T> type, long x) {
        array = (T[]) Array.newInstance(type, size);
        this.x = x;
    }

    public void forEach(Function<T> function) {
        for (T element : array) {
            x = function.perform(element, x);
        }
    }
}

class Compute {
    int factor;
    final long constant;

    public Compute(int factor, long constant) {
        this.factor = factor;
        this.constant = constant;
    }

    public long compute(long parameter, long x) {
        return x * factor + parameter + constant;
    }
}

public class Main {

    public static void main(String[] args) {
        List<Long> numbers = new ArrayList<Long>(50000000);
        for (int i = 0; i < 50000000; i++) {
            numbers.add(i * i + 5L);
        }

        long x = 234553523525L;

        long time = System.currentTimeMillis();
        for (int i = 0; i < numbers.size(); i++) {
            x += x * 7 + numbers.get(i) + 3;
        }
        System.out.println(System.currentTimeMillis() - time);
        System.out.println(x);
        x = 0;
        time = System.currentTimeMillis();
        for (long i : numbers) {
            x += x * 7 + i + 3;
        }
        System.out.println(System.currentTimeMillis() - time);
        System.out.println(x);
        x = 0;
        numbers = null;
        MyArray<Long> myArray = new MyArray<Long>(50000000, Long.class, 234553523525L);
        for (int i = 0; i < 50000000; i++) {
            myArray.array[i] = i * i + 3L;
        }
        time = System.currentTimeMillis();
        myArray.forEach(new Function<Long>() {

            public long perform(Long parameter, long x) {
                return x * 8 + parameter + 5L;
            }
        });
        System.out.println(System.currentTimeMillis() - time);
        System.out.println(myArray.x);
        myArray = null;
        myArray = new MyArray<Long>(50000000, Long.class, 234553523525L);
        for (int i = 0; i < 50000000; i++) {
            myArray.array[i] = i * i + 3L;
        }
        time = System.currentTimeMillis();
        myArray.forEach(new Function<Long>() {

            public long perform(Long parameter, long x) {
                return new Compute(8, 5).compute(parameter, x);
            }
        });
        System.out.println(System.currentTimeMillis() - time);
        System.out.println(myArray.x);
    }
}

Wynik pod Javą 6u24 i moim starym kompem:

276
-699150247503735895
274
-699150247503735895
248
-699150247503735895
266
-699150247503735895

Rust i C++ chwalą się "zero-cost abstractions" a jak widać Java też je ma :]

Natomiast .NET Core 2 nadal ma bardzo kiepskiego JITa. Nie wiem jak z .NET Core 3 który wyszedł chyba wczoraj albo kilka dni temu. Mieli poprawić JITa, ale na ile im wyszło nie sprawdziłem jeszcze.

2

@Wibowit:

że programiści bawią się w jakieś ręczne optymalizacje

zastanawianie się czy użyć foreacha czy może fora z indeksowaniem

prawie literally nikt

0

ForEach działa tylko na listach i trzeba hackować coś typu: .Where(x => { (...) return true;})

Fakt, trochę lipa że nie ma ForEach dla IEnumerable, ale z tym hackowaniem to też przesada. Lepiej napisać sobie extension method dla IEnumerable. Z tym zadaniem podanym przez Ciebie @WeiXiao to albo jestem ślepy albo nie widzę tam nic niezwykłego. Każde wywołanie Console.WriteLine wypisze aktualną wartość danej zmiennej, w przypadku zmiennej a to zawsze będzie "b". Czy się mylę?

Swoją drogą to z tym narzekanie na query syntax chodzi wam o linq, np: from p on people where... ?

0

@WeiXiao:
No nie byłbym taki pewien. Wydajności virtuala się tutaj ludzie boją na forum (a przynajmniej przytaczają to jako argument przy projektowaniu klas), a dyskusję o foreach vs for w C# podsłyszałem w korpo ze 2-3 lata temu.

0

Ludzie znający C# nie boją się wydajności virtuala, a odpowiedniki dyskusji foreach vs for są też w Javie. Szkoda czasu.
Dla mnie wadą dotneta jako platformy jest brak higher kinded types i brak wielodziedziczenia stanu, ale pewnie kiedyś i tego się dorobi. Ponadto ciągle przeciętny JIT i brak porządnych GC, przez co .NET nie jest używany w projektach typu Spark (dopiero ostatnio zaczęli się bawić w bindingi).
Wadą ekosystemu jest zbyt długie skupienie się tylko na świecie MS. To też może się zmieni za parę lat i ludzie przekonają się, że warto to rozwijać, no ale to trzeba zaczekać na poważne wdrożenie .NET Core 3.1.

4

@WeiXiao: jeśli kogoś dziwi to co tam się dzieje powinien spróbować zrozumieć technologię której używa. Tam nie ma niczego dziwnego.

0

Ogólnie to, że bez Windowsa za bardzo nie ma sensu kodowanie w C#. Dodatkowym straszakiem dla mnie był fakt, że licencje za baze czy serwer były płatne (już nie pamietam co dokładnie, ale m$ też musi na czymś zarobić).

Inaczej C# to dobry język do pracy zawodowej, kodowania gier, i pracy z kinect.

1

@nohtyp: Wydaje mi się, że od 2019 doszedł jeszcze web. Projekty ASP .NET Core + Angular/React są teraz na topie.

2
nobody01 napisał(a):

Mi do głowy przychodzi jedynie niepotrzebny query syntax, obecność ref i out?

Query syntax najczęściej jest paskudny ale zdarzają się sytuacje gdzie łatwiej napisać jest coś bardzo skomplikowanego używając tej składni.
Kompletnie natomiast nie rozumiem dlaczego uważasz ref i out za wady języka. Jeśli problemem jest błędne nadużycie to jest to problem użytkownika a nie języka (niestety zdarzają się "doświadczeni programiści" którzy nie wiedzą jak to działa).

Ja miałbym duży problem z udzieleniem odpowiedzi na to pytanie bo nie widzę w C# wad, szczególnie po wprowadzeniu Nullable Reference Types.

Oczywiście poza domyślną implementacją interfejsu - to moim zdaniem rak.

0

W C# nie ma variadic templates i nie da się używać metaprogramowania.

0

Swoją drogą dobry wątek. Każdy teraz się zastanowi i stwierdzi, że jego ulubiony język nie ma wad :D

12

Największą wadą C# jest pojawiający się wszędzie Wibowit.

0

Bardzo fajna technologia, niestety trochę niedoceniona (wynagrodzenia), w porównaniu do Javy. Cenię w stajni M$ to, że chcieli stworzyć bardzo kompleksowe środowisko, w którym można pisać gry, aplikacje mobilne, stacjonarne, backend i w dużej mierze frontend, chociaż to ostatnie najsłabiej na tę chwilę wychodzi. Te środowiska są tak wydajne obliczeniowo, że aż uczą złych nawyków. Potem człowiek musi coś zrobić w node, czy php i się okazuje, że przepisany w ten sam sposób algorytm muli.

Co do wad:

  • podstawowe IDE to visual studio, chociaż w dużej mierze można działać innymi IDE, to VS to podstawa. VS to takie "inny świat". W przeciwieństwie do pracy w Javie, czy Node dużo w nim się "wyklikuje", by ustawić "solucje" zamiast pisać. Trudno to opisać osobie, która chce dopiero poznać wady środowiska, bez konkretnego przykładu, ale M$ stara się wiele rzeczy udostępnić przez UI. Nie ma w tym nic złego, ale jest to zdecydowanie inna logika pracy i bardzo hermetyczne środowisko, z którego trudno wrócić do normalnego świata.
  • podstawowa platforma to windows, oczywiście można pracować na innych, ale podstawowe środowisko, to windows. Jest to szczególnie uciążliwe, jak chce się fullstackować, a praca z frameworkami frontendowymi bywa uciążliwa na windowsie (niektóre paczki są niedostosowane, szczególnie w react, nie wiem jak angular i vue, nie pracuję w nich). Praca na windowsie też w ujęciu kariery jest nieciekawa, bo większość serwerów stoi na linuxie. Ten podpunkt może być subiektywny. Może cześć ludzie kocha windowsa, nie wiem.
  • wiele z elementów tego środowiska jest płatne i licencjonowane, np. wersje MSSQL itp. Prawie wszystko można ostatecznie za darmo, ale pewnym standardem są rozwiązania płatne.
  • Implementacja na mobile (xamarin) jest mało popularna.
  • Niższe płace niż w Javie.
  • C# jest bardzo dojrzałym, statycznie typowanym językiem, świetnie zintegrowanym z IDE, pisanie w nim jest mega wygodne i trudno później przesiąść się do środowiska, gdzie reguły trzeba samemu ustalić.
  • Mam takie wrażenie, że to środowisko, które skłania do zaawansowanych rozwiązań, np. CI/CD, ma też bardzo dużo możliwości. W tym sensie nie jest to przyjazne dla początkujących, którzy chcieliby łatwo zbudować projekt i wrzucic przez ftp na hosting współdzielony :D. Dobra może głupio to napisałem, ale samo IDE jest tak rozbudowane, że na początku może przerazić.

Słowem, wszystkie wady (oprócz płac) są subiektywne i wynikają raczej z hermetycznego, odmiennego środowiska. Podsumować je można stwierdzeniem - kto co lubi.

4
WeiXiao napisał(a):

prawie literally nikt

Niektórzy są tak skupieni na aspektach wydajnościowych, że nie są w stanie po prostu ogarnąć, że explicit is better than implicit.

var napisał(a):

Query syntax najczęściej jest paskudny ale zdarzają się sytuacje gdzie łatwiej napisać jest coś bardzo skomplikowanego używając tej składni.

Tylko jeśli musisz użyć join albo let. Dziwnym trafem mi się to zdarzało tylko przy okazji pracy w jakiejś legacy kupie (np. integracja z bazą danych bez FK przy pomocy EF).
Nie jestem przekonany co do rozwiązywania każdego problemu poprzez dodawanie nowych słów kluczowych, a Microsoft chyba idzie na jakiś rekord.

Kompletnie natomiast nie rozumiem dlaczego uważasz ref i out za wady języka.

Nie są potrzebne do współczesnego programowania. Szkoda, że nie ma jakiegoś takiego C# lite bez tych wszystkich instrukcji do interopa, ręcznego zarządzania pamięcią, i innych rzeczy wprowadzających zamieszanie i niespójność.

Oczywiście poza domyślną implementacją interfejsu - to moim zdaniem rak.

Nie wiem czy rak, ale jakoś mnie to nie przekonuje. Mam wrażenie, że to taka pomoc dla leniwych, którym nie zależy na designie. No i ogólnie to złamanie pewnych, zdawałoby się, nienaruszalnych fundamentów języka. No i tak w sumie, to po co takie tworzy dalej nazywać interfejsami, skoro w praktyce to klasy abstrakcyjne?

Rakiem za to jest dynamic. Z drugiej strony i tak dobrze, że w prowadzili dynamiczne typowanie tak późno, a nie jak w niektórych konkurencyjnych technologiach przy okazji wprowadzania generyków.

renderme napisał(a):

Bardzo fajna technologia, niestety trochę niedoceniona (wynagrodzenia), w porównaniu do Javy.

Oprócz kwoty bezwzględnej liczy się też stosunek płacy do radości z korzystania z języka. W takim SAPie czy Cobolu też dużo płacą.

Potem człowiek musi coś zrobić w node, czy php i się okazuje, że przepisany w ten sam sposób algorytm muli.

To w takim razie taki ktoś albo od początku miał zły algorytm, albo nie zna JS/PHP.

W przeciwieństwie do pracy w Javie, czy Node dużo w nim się "wyklikuje", by ustawić "solucje" zamiast pisać.

Sześć kliknięć aby zrobić aplikację webową (więcej, jeśli chcesz dockera). No ja nie wiem czy to jest znacząco więcej niż żeby zacząć projekt w Node (przynajmniej w narzędziach od JetBrains). No i jakoś nie widzę nic złego w tym, że jakąś żmudną i niekonstruktywną robotę konfiguracyjną zrobi za mnie wizard. Wolę się skupić na kodzie.

0

nie są w stanie po prostu ogarnąć, że explicit is better than implicit

Tzn var jest zły bo ukrywa typ?

1
renderme napisał(a):
  • wiele z elementów tego środowiska jest płatne i licencjonowane, np. wersje MSSQL itp. Prawie wszystko można ostatecznie za darmo, ale pewnym standardem są rozwiązania płatne.

Ze środowiska Microsoftu? No ale nikt nie każe przecież korzystać z SqlServer, równie dobrze możesz użyć Postgresa albo innej bazy. Rozwiązania płatne są standardem chyba dlatego, że Microsoft rozdaje oprogramowanie szkołom, uczelniom, uczniom i studentom przez co ludzie się przyzwyczajają. No i w sytuacji kiedy trzeba wybrać np. bazę, szczególnie nie za swoje pieniądze to wybierane jest to co jest człowiekowi znane.

W samym C# czasem brakowało mi możliwości tworzenia generycznych atrybutów (ale widzę, że ktoś nad tym pracuje https://github.com/dotnet/roslyn/blob/master/docs/Language%20Feature%20Status.md)

1
somekind napisał(a):

Oprócz kwoty bezwzględnej liczy się też stosunek płacy do radości z korzystania z języka. W takim SAPie czy Cobolu też dużo płacą.

Ok, ale są podobnie przyjemne języki, np. Java, które są płatne wyżej. To jest ogólnie bardzo subiektywne.

Potem człowiek musi coś zrobić w node, czy php i się okazuje, że przepisany w ten sam sposób algorytm muli.

To w takim razie taki ktoś albo od początku miał zły algorytm, albo nie zna JS/PHP.

Miał nieoptymalny algorytm, który w .net działał dostatecznie wydajnie.
Widywałem sytuacje, gdy w c# wystarczyło stosować linq to przeszukiwania tablic, a odpowiedniki w js były już za wolne i trzeba było optymalizować, np. robić hashmapy. Widywałem też sytuacje, gdzie bez krępacji tworzyło się dla każdej oparacji nową instancje klasy w c# i GC to czyścił dość wydajnie, a w PHP pojawiały się problemy. Oczywiście, można to było od początku projektować idealnie, ale tu jest sedno mojego zarzutu. C#/.net jest tak wydajny, że wybacza wiele błędów optymalizacyjnych i może przez to prowadzić do złych nawyków. Podstawowym jest nadużywanie linq i założenie, że inne języki też wybaczą ci ciągłe operacje na tablicach i że ogólnie "tak można".

W przeciwieństwie do pracy w Javie, czy Node dużo w nim się "wyklikuje", by ustawić "solucje" zamiast pisać.

Sześć kliknięć aby zrobić aplikację webową (więcej, jeśli chcesz dockera). No ja nie wiem czy to jest znacząco więcej niż żeby zacząć projekt w Node (przynajmniej w narzędziach od JetBrains). No i jakoś nie widzę nic złego w tym, że jakąś żmudną i niekonstruktywną robotę konfiguracyjną zrobi za mnie wizard. Wolę się skupić na kodzie.

Dobra, nie oszukujmy się. W tym IDE wyklikiwuje się masę rzeczy w porównaniu z innymi technologiami. Owszem, czasem to ścieżka bardzo szybka, ale nie bez powodu w podstawowej wersji w VS NIE MA zintegrowanej konsoli! Dla mnie to był szok, że zamiast wpisywać komendę w konsoli wybiera się operację z UI.
Czy jest to złe? Myślę, że hermetyczne. Osobiście znam C#powców którzy oduczyli się używania konsoli prawie w ogóle. Nawet z gita korzystają przez VS. Ja mam takie podejrzenie, że ta hermetyczność .net wynika z chęci uzależnienia dewelopera od M$. Obiektywnie niby nie jest to nic złego, ale warto o tym wiedzieć przed wejściem w tę technologię.

2
renderme napisał(a):

Ok, ale są podobnie przyjemne języki, np. Java, które są płatne wyżej. To jest ogólnie bardzo subiektywne.

Myślę jednak, że skoro są płatne wyżej, to nie dlatego, że są podobnie przyjemne, tylko np. dlatego, że trzeba jakoś zachęcić do pracy w nudnych branżach albo na plantacji spaghetti.

Co do przyjemności, to zgoda, kwestia subiektywna. Są wszakże ludzie, którzy twierdzą, że im się przyjemnie pracuje bez typów, bez generyków, bez refleksji czy bez testów albo np. gdy testy wykonują nieprodukcyjny kod tylko jakieś mocki. Nie ma co w to wnikać, bo i tak się nie zrozumie. ;)

Miał nieoptymalny algorytm, który w .net działał dostatecznie wydajnie.
Widywałem sytuacje, gdy w c# wystarczyło stosować linq to przeszukiwania tablic, a odpowiedniki w js były już za wolne i trzeba było optymalizować, np. robić hashmapy. Widywałem też sytuacje, gdzie bez krępacji tworzyło się dla każdej oparacji nową instancje klasy w c# i GC to czyścił dość wydajnie, a w PHP pojawiały się problemy. Oczywiście, można to było od początku projektować idealnie, ale tu jest sedno mojego zarzutu. C#/.net jest tak wydajny, że wybacza wiele błędów optymalizacyjnych i może przez to prowadzić do złych nawyków. Podstawowym jest nadużywanie linq i założenie, że inne języki też wybaczą ci ciągłe operacje na tablicach i że ogólnie "tak można".

Ale to jest zarzut przeciwko .NET? Bo moim zdaniem powinien być przeciwko tym językom, które nie dają sobie rady.

LINQ jest niewydajny z założenia. To samo można osiągnąć wydajniej, tylko to zazwyczaj nie ma sensu, bo LINQ do typowych jest wystarczająco wydajny, za to szybszy i czytelniejszy w implementacji.

Dobra, nie oszukujmy się. W tym IDE wyklikiwuje się masę rzeczy w porównaniu z innymi technologiami.

Nie chcę nikogo oszukiwać. :) Po prostu nie wiem, co konkretnie masz na myśli. Ja poza klikaniem przy tworzeniu solucji/dodawaniu projektu, nie klikam prawie wcale. No chyba, że mam drugą rękę zajętą jedzeniem, to wtedy po prostu łatwiej użyć myszy niż klawiatury.
Może kwestia rodzaju oprogramowania jaki się tworzy? Jakbym np. pisał na desktop, to pewnie dużo bym używał różnych designerów, no ale nie jestem pewien, czy to jest typowa praca w dzisiejszych czasach.

Owszem, czasem to ścieżka bardzo szybka, ale nie bez powodu w podstawowej wersji w VS NIE MA zintegrowanej konsoli! Dla mnie to był szok, że zamiast wpisywać komendę w konsoli wybiera się operację z UI.

W sensie Command Window? To jest w każdej wersji, nawet Community, i da się tym zastąpić UI. Nie wiem czy w całości, bo to dla mnie dziwny pomysł, żeby pracować w ten sposób zamiast korzystania ze skrótów klawiaturowych oraz ctrl + q dla całej reszty, której się nie pamięta.
Jeśli chodzi zaś o konsolę systemową, do Nuget Console sprawdza się w tej roli.

Czy jest to złe? Myślę, że hermetyczne. Osobiście znam C#powców którzy oduczyli się używania konsoli prawie w ogóle.

Owszem, to też moje spostrzeżenie, że jest masa ludzi, którzy boją się konsoli.

Nawet z gita korzystają przez VS.

No to jest w ogóle dziwne dla mnie, bo VS ma moim zdaniem wybitnie nieintuicyjny interfejs do obsługi kontroli wersji. Na szczęście są lepsze alternatywy.

Ja mam takie podejrzenie, że ta hermetyczność .net wynika z chęci uzależnienia dewelopera od M$. Obiektywnie niby nie jest to nic złego, ale warto o tym wiedzieć przed wejściem w tę technologię.

Trochę masz rację, chociaż myślę, że to im się nigdy za bardzo nie udawało. W karierze widziałem może jeden mały projekt oparty na stacku 100% microsoftowym, reszta generalnie zazwyczaj używała opensourcowych alternatyw albo np. darmowych baz danych. A teraz to już w ogóle chyba Microsoft poddał się z tymi próbami uzależniania.

0
nobody01 napisał(a):

Ktoś tu kiedyś napisał, że jak się jest profesjonalistą, to zna się nie tylko zalety, ale też wady swojej technologii. Dlatego na rozmowach rekrutacyjnych zadaje pytania typu Co się Panu nie podoba w technologii/języku X? No właśnie, co byście odpowiedzieli, jakbyście dostali takie pytanie?

Nie podoba mi się, że w oferty pracy w tej technologi mają niższe widełki od ofert w innych technologiach.
Ciekawe co by było w odpowiedzi.

0

Ostatnio zacząłem uczyć się Javy. Pierwsze moje wrażenie estetyczne jest takie, że język ten musiał stworzyć jakiś amator tzn. wielu amatorów.
C# i platforma NET to jednak bardzo logiczna i przejrzysta struktura jak w matematyce. Z języka C# usunięto wszystko to co było złe w C++.
Wadą programów c# i NET może być prędkość . Są wolniejsze od tych napisanych w C++ . Język c# jest mniej podatny na błędy i wycieki pamięci od c, c++

3

C# i platforma NET to jednak bardzo logiczna i przejrzysta struktura jak w matematyce.

x = x + 1 - pokaż to matematykowi :P

0

x := x + 1

Ale to było kiedy najpierw uczono podstaw, nie jak teraz, najpierw framework, potem ewentualnie pętli i co to dziedziczenie (jak już zaczynamy naukę od języka obiektowego).

0

Jakich języków uczą teraz w szkołach? Pythona ?

1

Mi przy wyborze C# vs Java pare lat temu wyszly m.in. kwiatki wymienione wyzej:

  • troche brzydsza skladnia w C#
  • brak przenosnosci kodu, w tym GUI
  • jakos C# dziwnie jest unikane w srodowiskach zblizonych do matematykow (polecam porownac liczbe ksiazek w dziedzinach ANN, CNN, PSO, ML), roznica wtedy byla jakos tak 1:10 na rzecz Javy.

Teraz po wyjsciu .NET Core moze to sie zmienilo, ale juz jakos nie mam czasu na prawie taki sam jezyk. Raczej jakbym mial sie uczyc czegos na maszynie wirtualnej to Kotlina, Clojure lub Groovy.

1

To moja subiektywna ocena, ale te całe LINQ wygląda odrażająco dla mnie. Ogólnie dla mnie kod c# wygląda obrzydliwie, npp. pisanie nazw metod z dużej :/

3

@scibi92:

List<String> myList =
    Arrays.asList("a1", "a2", "b1", "c2", "c1");

myList
    .stream()
    .filter(s -> s.startsWith("c"))
    .map(String::toUpperCase)
    .sorted();

Wersja w C# z LINQ:

var myList = new List<string> { "a1", "a2", "b1", "c2", "c1" };

var toPrint = myList
        .Where(x => x.StartsWith("c"))
        .Select(x => x.ToUpper())
        .OrderBy(x => x);

Jak dla mnie, to różnica jest w nazwach metod i konwencji, no i w tym, że w C# to po prostu działa na dowolnej kolekcji, bez wołania żadnego stream().

0

@somekind: faktycznie, mój błąd, dopiero teraz dowiedziałem się że są 2 wersje LINQ. Zawsze widzialem tą wersję SQLową...

1 użytkowników online, w tym zalogowanych: 0, gości: 1