C# to jęzчк кдpitдlistóщ i кцłдкóщ PЯOLETдЯIЦSZE GO ПIE ЦŻЧЩдĆ!!!

0

Próbuję coś zrobić w C# i zalewa mnie potop NullPointerException...

Ech, nie mogę się odzwyczaić od Cpp chyba

List<int> list; -> ZUOOOO!!! NullPointerException!!

TRzeba pisać:

List<int> list = new List<int>();

Słyszysz, C#?! Jesteś głupi język!!!* 2x więcej pisania! Ależ to uciążliwe.

KIedy się wreszcie do tego przyzwyczaję i przestanę produkować NullPointerExceptiony.!?

*Dobra, zwracam honor. C# w wielu punktach jest dużo wygodniejszy od Cpp. Ale nie w tym. To jak C#, wybaczysz mi wyzwiska i będziemy trzymać sztamę dalej? ^^ xoxo <3 <3 Luvciam cię C#!

1

No tak, twoje przyzwyczajenia z cpp oznaczają, że c# ssie...

1
dadalop napisał(a):

No tak, twoje przyzwyczajenia z cpp oznaczają, że c# ssie...

Ssij szarp ssie z definicji. Albowiem jedynym produktem Micro$oftu który nie ssie może być wyłącznie odkurzacz.

0

Rok 2016... ludzie odpowiadają na słaby trolling xD

0

Kłamiesz. Windows Phone nie ssie i świetny jest, najlepszy system na komórki ever

0
Świetny Terrorysta napisał(a):

Rok 2016... ludzie odpowiadają na słaby trolling xD

Trolling to w sumie najlepszy synonim dla słowa C#

8

List<int> list = new List<int>();

var list = new List<int>();
2

Tak właściwie c# jest jednym z lepiej przemyślanych języków problemem jest to że nikt nie lubi ms.

0
Wielki Lis napisał(a):

Tak właściwie c# jest jednym z lepiej przemyślanych języków problemem jest to że nikt nie lubi ms.

To.

0
Anon napisał(a):
Wielki Lis napisał(a):

Tak właściwie c# jest jednym z lepiej przemyślanych języków problemem jest to że nikt nie lubi ms.

To.

Jak nikt nie lubi MS ? Co ty piszesz w ogole ? Ja uwielbiam MS, gdy nie MS ominęło by nas w zyciu tyle frajdy ze smiania sie z administratorow windows ;).

0

Cóż ms nadal ma lepszą politykę niż konami.

0

A oto jest banalne porównywanie zaimplementowane w C#:

        public override bool Equals (object obj) { return this.Equals(obj as Move); }
	public bool Equals (Move move)
	{
		if(System.Object.ReferenceEquals(move, null)) return false;
		if(System.Object.ReferenceEquals(this, move)) return true;
		if(this.GetType() != move.GetType()) return false;
		return this.name == move.name;
	}
	public override int GetHashCode() { return name.GetHashCode(); }
	public static bool operator == (Move lhs, Move rhs)
	{
		if(System.Object.ReferenceEquals(lhs, null) && System.Object.ReferenceEquals(rhs, null)) return true;
		if(System.Object.ReferenceEquals(lhs, null) || System.Object.ReferenceEquals(rhs, null)) return false;
		return lhs.Equals(rhs);
	}
	public static bool operator != (Move lhs, Move rhs) { return !(lhs == rhs); }

Celowo formatowanie raczej skompresowane, pedanci pewnie zaraz zaczną na mnie gromy spuszczać że powinienem był wstawić 2x więcej przestrzeni... A TO ZAJĘŁO 16 WIERSZY!!! WOW!!!!

Poważnie, to okiem dyletanta - amatora (moim) 16 Wierszy na banalne porównywanie to naprawdę ZA DUŻO. (nie wspominając o konieczności overloadowania GetHashCode co mi jest na plaster).

Dlaczego nie ma np. czegoś takiego.

class SomeClass : IEquatable<SomeClass>
{
    [Meaningful] public double d;
    [Meaningful] public string s;
    int i;
    // Jakieś metody
}

Krotka złożona z tych pól, które są z atrybutem Meaningful (nazwa atrybutu pewnie oczywiście mogłaby być lepsza), definiuje relację równożności; jeśli w obiektach którekolwiek z tych pól się różni, to obiekty uznaje się za różne, wpp takie same. I wszystie Equals i operator == i inne takie piszą się same, tak jak i GetHashCode się pisze samo na podst. tych pól.

A jak komuś się to nie podoba, chce większą kontrolę, to proszę, może sam sobie wszystko pisać, nikomu nie nakazuje się używać Meaningful. Ale w większości wypadków chyba Meaningful by uprościło życie.

Inny pomysł: tylko jedna fukncja do napisania przez usera:

public override bool SimpleEquals(SomeClass sc)
{
    return this.name == sc.name;
}

A to całe sprawdzanie nulli etc. niech się robi samo (chociaż tutaj już nie mam pomysłu jak to zaimplementować).

3

<QUOTE>Dlaczego nie ma np. czegoś takiego.

class SomeClass : IEquatable<SomeClass>
{
    [Meaningful] public double d;
    [Meaningful] public string s;
    int i;
    // Jakieś metody
}
</quote> To zrób ;-)
0

Zobacz klasę Eq w haskellu ;* W sumie spotkałem się z opinią że dobry kod w oop to kod w fp.

1
Wybitny Kaczor napisał(a):

Zobacz klasę Eq w haskellu ;* W sumie spotkałem się z opinią że dobry kod w oop to kod w fp.

"dobry kod OOP" to oxymoron

0
Krwawy Młot napisał(a):
Wybitny Kaczor napisał(a):

Zobacz klasę Eq w haskellu ;* W sumie spotkałem się z opinią że dobry kod w oop to kod w fp.

"dobry kod OOP" to oxymoron

Kto zna jave wie o co chodzi.

4

Ja wiem że to trolling, ale zróbcie research chociaż przed napisaniem posta :P.

void Foo()
{
    List<int> list;
    list.Add(3);
}

Zagadka: czy ten kod rzuci NullPointerException i czemu nie?

PS. Przede wszystkim dlatego, że w C# nie ma czegoś takiego jak NullPointerException. Za to jest NullReferenceException. Ale już nawet nie tego się czepiam.

edit

        public override bool Equals (object obj) { return this.Equals(obj as Move); }
    public bool Equals (Move move)
    {
        if(System.Object.ReferenceEquals(move, null)) return false;
        if(System.Object.ReferenceEquals(this, move)) return true;
        if(this.GetType() != move.GetType()) return false;
        return this.name == move.name;
    }
    public override int GetHashCode() { return name.GetHashCode(); }
    public static bool operator == (Move lhs, Move rhs)
    {
        if(System.Object.ReferenceEquals(lhs, null) && System.Object.ReferenceEquals(rhs, null)) return true;
        if(System.Object.ReferenceEquals(lhs, null) || System.Object.ReferenceEquals(rhs, null)) return false;
        return lhs.Equals(rhs);
    }
    public static bool operator != (Move lhs, Move rhs) { return !(lhs == rhs); }

Litości... Jak ktoś jest słabym programistą, to w każdym języku słaby kod napisze ;). Ale podejrzewam że trollujesz i nie piszesz takiego kodu naprawdę.

Porównaj (pisane z palca, nietestowane, ale zasadę widać):

public override bool Equals (object obj) { return obj is Move && this == obj; }

public override int GetHashCode() { return name.GetHashCode(); }

public static bool operator == (Move lhs, Move rhs)
{
    if (lhs == null || rhs == null) { return object.ReferenceEquals(lhs, rhs); }
    return lhs.name == rhs.name;
}

public static bool operator != (Move lhs, Move rhs) { return !(lhs == rhs); }

A tak szczerze, to w swojej karierze programisty C# naprawdę rzadko mi się zdarzało że musiałem przeciążać Equals. A operator== przeciążałem jeszcze rzadziej. To wygląda groźnie, ale w typowym kodzie bardzo rzadko jest potrzebne.

(nie wspominając o konieczności overloadowania GetHashCode co mi jest na plaster).

To nie jest koniecznosć overloadowania. Ale kompilator życzliwie Cię ostrzega, jeśli nadpiszesz Equals a nie nadpiszesz GetHashCode - żeby Ciebie uratować przed samym sobą (bardzo wesołe rzeczy się dzieją przy korzystaniu z Set<> etc jeśli się tego nie zrobi).

Krotka złożona z tych pól, które są z atrybutem Meaningful (nazwa atrybutu pewnie oczywiście mogłaby być lepsza), definiuje relację równożności; jeśli w obiektach którekolwiek z tych pól się różni, to obiekty uznaje się za różne, wpp takie same. I wszystie Equals i operator == i inne takie piszą się same, tak jak i GetHashCode się pisze samo na podst. tych pól.

Generalnie pomysł nie jest taki głupi - tylko zamiast Meaningful dużo lepsze by było generalnie [IgnoreWhenComparing] o odwrotnym znaczeniu. I w tym momencie możesz spokojnie napisać własną metodę do tego ;). Nie chce mi się teraz trochę demonstrować, ale to generalnie 10 linijek rekurencyjnego kodu. Czemu tego nie ma w core? Pewnie po to, że (jak wyżej) to niepotrzebne, oraz żeby zniechęcić do głębokiego porównywania obiektów (to zazwyczaj zły pomysł).

Inny pomysł: tylko jedna fukncja do napisania przez usera:

public override bool SimpleEquals(SomeClass sc)
{
    return this.name == sc.name;
}

A to całe sprawdzanie nulli etc. niech się robi samo (chociaż tutaj już nie mam pomysłu jak to zaimplementować).

A co jeśli chciałbym stworzyć klasę DbNull, dla której new DbNull() == null zwraca true? Ok, nie mówię że to dobry pomysł :P.

Tak samo pewnie są przypadki gdzie chciałbym żeby x == y zwróciło true, nawet mimo że są różnych typów (np. mam klasy ImReImaginaryNumber i RPhiImagimaryNumber).

(to po części racjonalizowanie, bo Equals wygląda jak wygląda dlatego, że w C# 1.0 nie było generyków. Tak czy inaczej sensowne racjonalizowanie).

nie, nie wiem czemu odpisuje poważnie we flame ;)

0

WOW, @msm !!

Taka długa odpowiedź na moje posty wynikłe wyłącznie z odreagowywania frustracji wywołanej siedzieniem któryś dzień do białego rana...!!! Szacun, dzięki!!

To teraz ja też napiszę na poważnie.

Litości... Jak ktoś jest słabym programistą, to w każdym języku słaby kod napisze ;). Ale podejrzewam że trollujesz i nie piszesz takiego kodu naprawdę.

Tak, naprawdę napisałem taki kod. Dlaczego? Bo tak dobrze radziła / kazała dokumentacja: https://msdn.microsoft.com/en-us/library/dd183755.aspx A ja, jako pokorny programista, który wie, że jest słaby, staram się trzymać dokumentacji tam, gdzie nie jest tak, że wiem na pewno, co robię. Aczkolwiek pewnie gdybym posiedział nad rozwązaniem z dokumentacji trochę dłużej, zamiast przeklepywać, to może i bym sam wpadł na Twoje rozwiązanie.

Inna rzecz, że wcale nie jestem jakimś wielkim hejterem C#. Nawet wygodniej mi się pisze w nim niż w C++ jeśli mam być szczery. Ale parę WTF-ów faktycznie zaliczyłem, choć wiele z nich wynika albo z tego, że w Unity jest archaiczna wersja C# (i tak nie mogę np. zrobić seta który byłby readonly) albo prawdopodobnie z mojej niekompetencji (np. serializacja; XMLSerializer wymaga, by wszystkie pola poddane serializacji były publiczne; ale nie wszystko można od razu zserializować, więc niektóre pola istnieją tylko na potrzeby serializacji i nie mają być odczytywane przez inne klasy; więc w końcu stawiam _ przed nazwą pola żeby pokazać że semantycznie jest ono prywatne mimo że jest publiczne... Co robię źle?

żeby zniechęcić do głębokiego porównywania obiektów (to zazwyczaj zły pomysł).
W zasadzie może i masz rację. Teraz myślę, że chyba rzeczywiście się zagalopowałem. Zaczyna mi się wydawać, że spośród na oko jakiś pięciu takich głębokich porównań jakie zaimplementowałem bodajże tylko jedno było mi naprawdę potrzebne.
Być może dwa, ale to już wymaga zastanowienia.

C# nie ma czegoś takiego jak NullPointerException
Rzeczywiście... Dopiero musiałem sprawdzić naocznie, co mi rzucało.
Natomiast faktycznie zdarzyło mi się już sporo razy zasypać się NullReferenceException z powodu odruchowego nieinicjalizowania pól. Teraz już powoli się tego uczę...

A co jeśli chciałbym stworzyć klasę DbNull, dla której new DbNull() == null zwraca true?
To mógłbyś wszystkie te pozostałe metody sam zaimplementować; SimpleEquals pomyślałem jako skrót dla 90% zastosowań, gdzie nie jest to konieczne.

tylko zamiast Meaningful dużo lepsze by było generalnie [IgnoreWhenComparing] o odwrotnym znaczeniu.
OKOK a dlaczego? Bo tak lepiej semantycznie czy tak łatwiej zaimplementować?

Jak ten mój pomysł zaimplementować przyznam się że nie wiem, bo nie czytałem jeszcze o definiowaniu własnych atrybutów i wszystkim z tym związanym... I chwilowo raczej nie poczytam bo nie jest mi to na razie potrzebne. Ale nie, nie pytam Cię w ten sposób, jak to konkretnie zaimplementować, aż tak leniwy nie jestem :) Sam to może kiedyś zrobię.

0

A, i kolejny zaliczony w C# WTF: pola statyczne są koniecznie stałe...

No to mam coś takiego:

int _pole;
public static int pole {get{ return instance._pole; }set{ instance._pole = value; }}

A dlaczego tak? Bo (kolejny WTF) - nie ma pól poza klasą.

Mam sobie klasę UserData na przechowywanie takich rzeczy jak np. awatara gracza. Przecież do dana globalna, semantycznie rzecz ujmując. No ale to się oczywiście może zmieniać... Tylko tak jak powyżej można napisać UserData.avatar, a to już jest wygodne. Dlaczego UserData to nie może być obiekt globalny...?

0

Ten temat to - czemu c# to nie c++ ? Rozumiem jakbyście z javą albo dartem porównywali , np dart ma fajny shortcut do konstruktora
Constructor(this.fst, this.scd);
w c# by się taki zdał i często by oszczędził przepisywania this.fst = _fst.

0
kmph napisał(a):

Próbuję coś zrobić w C# i zalewa mnie potop NullPointerException...

Ech, nie mogę się odzwyczaić od Cpp chyba

List<int> list; -> ZUOOOO!!! NullPointerException!!

TRzeba pisać:

List<int> list = new List<int>();

Słyszysz, C#?! Jesteś głupi język!!!* 2x więcej pisania! Ależ to uciążliwe.

KIedy się wreszcie do tego przyzwyczaję i przestanę produkować NullPointerExceptiony.!?

*Dobra, zwracam honor. C# w wielu punktach jest dużo wygodniejszy od Cpp. Ale nie w tym. To jak C#, wybaczysz mi wyzwiska i będziemy trzymać sztamę dalej? ^^ xoxo <3 <3 Luvciam cię C#!

XD

Porównaj scaner w Javie do cin, a nie to co tutaj przedstawiłeś - to jest dopiero przedłużanie kodu.

5
kmph napisał(a):

A, i kolejny zaliczony w C# WTF: pola statyczne są koniecznie stałe...

No to mam coś takiego:

int _pole;
public static int pole {get{ return instance._pole; }set{ instance._pole = value; }}

A dlaczego tak? Bo (kolejny WTF) - nie ma pól poza klasą.

Mam sobie klasę UserData na przechowywanie takich rzeczy jak np. awatara gracza. Przecież do dana globalna, semantycznie rzecz ujmując. No ale to się oczywiście może zmieniać... Tylko tak jak powyżej można napisać UserData.avatar, a to już jest wygodne. Dlaczego UserData to nie może być obiekt globalny...?

Pola poza klasą? Zmienne globalne? Wstydź się...

1

Ale w ogóle o co w tym wątku chodzi? Autor zarzuca C#'powi, że nie jest jak C++ i jeszcze wylewa swoją wielką frustrację. No nie jest i co z tego? To tak jakby zarzucać Pythonowi, że nie jest Bashem. Jeden wielki ROTFL.

0

Czytałem kiedyś takie żale C vs Pascal. Autor czepiał się dosłownie każdej różnicy (na korzyść C); a to że begin/end zamiast klamerek, a to że komentarze w klamerkach, a to braku średnika przed else i t.p.

Do @kmph. List<int> list; nie tworzy obiektu, bo List<> to klasa class, czyli reference type, więc zmienna zawsze jest jakby wskaźnikiem (używając nazewnictwa z C++) i dopiero obiekt trzeba utworzyć.
Jest to więc odpowiednik List<int> *list z C++ (zakładając istnienie klasy List).

2

Taka długa odpowiedź na moje posty wynikłe wyłącznie z odreagowywania frustracji wywołanej siedzieniem któryś dzień do białego rana...!!! Szacun, dzięki!!

Ja też nie wiem czemu tak odpisałem. Odreagowywałem frustracje wynikającą z siedzenia w pracy do późna :P.

Tak, naprawdę napisałem taki kod. Dlaczego? Bo tak dobrze radziła / kazała dokumentacja: https://msdn.microsoft.com/en-us/library/dd183755.aspx

Nie do końca, bo największa wada Twojego kodu to to, że praktycznie skopiowałeś metodę Equals do == - nawet w przykładzie który podałeś, operator== po prostu woła Equals. Dzięki temu nie ma kopiowania kodu.

...i w sumie to zrobiłem chyba buga w kodzie, bo zrobienie == w operator== to głupi pomysł (po to te object.ReferenceEquals są). No ale to by wyszło jakbym go chociaż uruchomił.

np. serializacja; XMLSerializer wymaga, by wszystkie pola poddane serializacji były publiczne; ale nie wszystko można od razu zserializować, więc niektóre pola istnieją tylko na potrzeby serializacji i nie mają być odczytywane przez inne klasy; więc w końcu stawiam _ przed nazwą pola żeby pokazać że semantycznie jest ono prywatne mimo że jest publiczne... Co robię źle?

Faktycznie, XMLSerializer patrzy tylko na publcizne pola. Odnośnie tego co z tym zrobić, jest kilka opcji - możesz np. zaimplementować ręcznie IXmlSerializable, ale to Ci się nie spodoba i będziesz narzekał że C# zły bo trzeba ręcznie kod pisać :P (chociaż tbh w C++ by było z tym dużo gorzej, przez brak sensownej refleksji). Możesz tez użyć DataContractSerializer czy jak się to nowe coś nazywa. Albo po prostu serializować binarnie. Jeszcze jest coś SOAPowego, ale nie kojarzę nazwy (ani czy się nada).
Albo możesz użyć serializacji binarnej.

W zasadzie może i masz rację. Teraz myślę, że chyba rzeczywiście się zagalopowałem. Zaczyna mi się wydawać, że spośród na oko jakiś pięciu takich głębokich porównań jakie zaimplementowałem bodajże tylko jedno było mi naprawdę potrzebne.
Być może dwa, ale to już wymaga zastanowienia.

:>

Rzeczywiście... Dopiero musiałem sprawdzić naocznie, co mi rzucało.
Natomiast faktycznie zdarzyło mi się już sporo razy zasypać się NullReferenceException z powodu odruchowego nieinicjalizowania pól. Teraz już powoli się tego uczę...

De facto problem jest taki, że jeśli masz klasę Foo, i napiszesz w C#:

Foo x;

to jest odpowiednikiem (w uproszczeniu) takiego kodu w C++:

Foo *x

Jeśli dokonasz takiego mentalnego podstawienia w głowie, to wszystko zaczyna działać logicznie (znając w C++). Nie odnosi się to do struktur, jeśli masz struct Bar, to Bar x w C# dalej działa podobnie jak Bar x w C++.

To mógłbyś wszystkie te pozostałe metody sam zaimplementować; SimpleEquals pomyślałem jako skrót dla 90% zastosowań, gdzie nie jest to konieczne.

Gdyby tylko w C# były traity... Da się to dohackować trochę na siłę extension methodami, ale ładne to nie będzie.

tzn. byś pisał:

class Test : ISimpleEquals
{
    public override bool Equals(object o) { return this.CheckSimpleEquals(o); }
    public bool SimpleEquals(Test t) { ... }
}

gdzie CheckSimpleEquals to extension method na ISimpleEquals. Bez traitów nie da sie tego niestety zrobić bez nadpisywania metody Equals.

Ewentualnie możesz jeszcze zrobić klasę bazowa na to, którą będzie można zastosować w 99% przypadków:

abstract class SimpleEquals : ISimpleEquals
{
    public override bool Equals(object o) { return this.CheckSimpleEquals(o); }
    abstract bool SimpleEquals(Test t);
}

OKOK a dlaczego? Bo tak lepiej semantycznie czy tak łatwiej zaimplementować?

Zaimplementowąć tak samo trudno, semantycznie w sumie chyba podobnie.
Jest tak lepiej dlatego, że w standardowym przypadku, kiedy porównujesz po wszystkich polach, zamiast wrzucać 30 atrubutów to Twojej klasy z danymi, będziesz dodawać zero. Czasami kiedy trzeba coś ignorować, będziesz dodawać jeden. No i dzięki temu od razu zadziała Ci takie porównanie z klasami zewnętrznymi, gdzie autor nie wiedział o tym atrybucie (wtedy będzie działało jak standardowe głębokie porównanie, po wszystkich polach).

Jak ten mój pomysł zaimplementować przyznam się że nie wiem, bo nie czytałem jeszcze o definiowaniu własnych atrybutów i wszystkim z tym związanym... I chwilowo raczej nie poczytam bo nie jest mi to na razie potrzebne. Ale nie, nie pytam Cię w ten sposób, jak to konkretnie zaimplementować, aż tak leniwy nie jestem :) Sam to może kiedyś zrobię.

Wiem że nie pytałeś :P. Po prostu to brzmi jak fajne ćwiczenie na atrybuty C#owe, i ich praktyczne zastosowanie. No i refleksję. A i może taki kod sie kiedyś gdzieś przyda.

A dlaczego tak? Bo (kolejny WTF) - nie ma pól poza klasą.

To akurat bardzo celowa decyzja projektowa. Jeśli powiesz słowo "zmienne globalne" na spotkaniu programistów C#/Javy, to zostaniesz prawdopodobnie zjedzony :P.

Mam sobie klasę UserData na przechowywanie takich rzeczy jak np. awatara gracza. Przecież do dana globalna, semantycznie rzecz ujmując. No ale to się oczywiście może zmieniać... Tylko tak jak powyżej można napisać UserData.avatar, a to już jest wygodne. Dlaczego UserData to nie może być obiekt globalny...?

Prosta odpowiedź: bo C# nie wspiera obiektów globalnych.

Skomplikowana odpowiedź: odkryj wzorzec https://en.wikipedia.org/wiki/Singleton_pattern :P.

Jeszcze bardziej skomplikowana odpowiedź: z czasem odkryjesz (pradopodobnie) że coraz mniej statycznych rzeczy jest Ci potrzebne.
W praktyce prawie zawsze jest jakiś kontekst, który jest lepszym miejscem na przechowywabnie danych niż globalnie. Przykładowo możesz mieć klasę Game, a w niej instancję klasy UserData - wtedy w klasie Game odwołujesz się do userdata po prostu jak do pola. (jak to dokładnie powino wyglądać w Twoim przykładzie, ciężko powiedzieć bez znajomości kodu).

Ot, C# był projektowany pod bardziej Enterprise aplikacje, a tam zmienne globalne to zawsze zły pomysł.

Ten temat to - czemu c# to nie c++ ?

E, bez przesady, bardziej "czym się różni C# od C++ i jak zmienić nawyki w związku z tym" :P.

Rozumiem jakbyście z javą albo dartem porównywali , np dart ma fajny shortcut do konstruktora

Constructor(this.fst, this.scd);

w c# by się taki zdał i często by oszczędził przepisywania this.fst = _fst.

Speak no more :P
https://msdn.microsoft.com/en-us/library/k6sa6h87.aspx

public CoOrds(int x, int y)
{
    this.x = x;
    this.y = y;
}

Czytałem kiedyś takie żale C vs Pascal. Autor czepiał się dosłownie każdej różnicy (na korzyść C); a to że begin/end zamiast klamerek, a to że komentarze w klamerkach, a to braku średnika przed else i t.p.

Chyba też czytałem ten artykuł. Albo przynajmniej podobny. Jak wolę C od Pascala (po części dlatego że go lepiej znam), to artykuł był strasznie słabo napisany - na zasadzie "w C jest inaczej, więc Pascal jest gorszy".
Ale tutaj wydaje mi się że jest trochę inny problem, bo C jest podobniejszy do Pascala niż C++ do C# - wbrew pozorom różnicę Pascal <-> C są w dużej części składniowe, a C++ vs C# to kompletnie inna filozofia.

0

Speak no more :P
https://msdn.microsoft.com/en-us/library/k6sa6h87.aspx

public CoOrds(int x, int y)
{
this.x = x;
this.y = y;
}

Daj mi to

 class CoOrds{
   int x;
   int y;
   CoOrds(this.x, this.y);
   operator ==(CoOrds oth) => (this.x == oth.x) && (this.y == oth.y);
} 

i jestem happy (chociaż inline function jest w nowym c#)

1

List<int> list; ale to nie rzuci wyjatku tylko po prostu sie nie skompiluje...
equals, gethashcode itp to nie trzeba nad tym spedzac wiecej niz 5-10 sekund, wystarczy wygenerowac (slyszal o r#?)
z tymi globalami to chyba zartujesz, serio w c++ to dobra praktyka? :)

0

i jestem happy (chociaż inline function jest w nowym c#)

Duh, wkleiłem nie to co chciałem wkleić.

Chciałem wkleić to -> http://www.pzielinski.com/?p=2185, czyli dokładnie to co proponowałeś.

class Person(string firstName,string lastName)
{
  private readonly string _firstName=firstName;
  private readonly string _lastName = lastName;

  public override string ToString()
  {
      return string.Format("{0} {1}", _firstName, _lastName);
  }
}

Niestety nie weszło to do ostatecznej wersji C# 6.0 (chociaż było już zaimplementowane) - okazało się że robi zbyt wiele niekompatybilnych zmian. Cóż, może w C# 7.0.

0

A i jeszcze chce etykietki do pętli jak w rustcie bo kiedyś żeby przerwać pętle ze switcha musiałem użyć goto ... No ale muszę chyba zacząć płakać na forum ms ;/

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