Gå til innhold

Vil lære meg å programmere, men har ingen aning hvor jeg skal begynne. Hjelp!


Anbefalte innlegg

Videoannonse
Annonse

Artig, kikket litt på den artikkelen jeg refererte til og ser jo at Generic types i C# egentlig er det samme som templates i C++. Anyway, på tide at tråden faller tilbake til sitt opprinnelige tema. På tide at trådstarter begynner å spørre og grave så vi andre kan svare ;-)

Generics og templates er ikke heeeelt det samme :)

Templates tillater veldig mye mer. Generics kan ikke ha annet enn typeargumenter, samt at alle typeargumenter som er satt må være statisk garantert til å la seg kompilere.

 

Dette er lovlig i C++:

template<typename T> T Add(const T lhs, const T rhs)
{
 return lhs + rhs;
}

 

Dette er ulovlig C#:

T Add<T>(T lhs, T rhs)
{
 return lhs + rhs;
}

 

Som sagt er det heller ikke tillat med annet enn typeargumenter.

Dette er gyldig C++:

template<typename T, int Dim> struct vector
{
private:
 T values[Dim];
};

 

C# har ikke noe lignende.

Endret av GeirGrusom
Lenke til kommentar

Hvorfor er dette mere lovlig i C++ en i C# ? Så vidt jeg kan se så er lovligheten i C# kun begrenset fordi C# ikke vet om + er en operator til T. Løses i såfall ved å legge til et WHERE og en klasse som inneholder operatoren og som angir at T må være nedarvet fra klassen. Er det sånn at C++ bare lar dette gå igjennom fordi kompilatoren overlater til utvikler å ha kontroll på om dette er lov eller ikke ? I så fall bare forsterker det min antydning tidligere om at "Alt er lov i C og ingenting passer på"

Lenke til kommentar

Fordi C++-templates bare klipper inn typene du gir den og sjekker etterpå om den klarer å kompilere det, tenker jeg.

 

Når man bruker templates lager kompilatoren like mange utgaver av samme funksjon som du gir den forskjellige typer. Med andre ord blir det generert like mye kode som om man skulle gjort det selv, man bare slipper. På godt og vondt.

 

For ordens skyld: hvordan C# løser det har jeg ingen peiling på.

Endret av Lycantrophe
Lenke til kommentar

Hvorfor er dette mere lovlig i C++ en i C# ? Så vidt jeg kan se så er lovligheten i C# kun begrenset fordi C# ikke vet om + er en operator til T. Løses i såfall ved å legge til et WHERE og en klasse som inneholder operatoren og som angir at T må være nedarvet fra klassen. Er det sånn at C++ bare lar dette gå igjennom fordi kompilatoren overlater til utvikler å ha kontroll på om dette er lov eller ikke ? I så fall bare forsterker det min antydning tidligere om at "Alt er lov i C og ingenting passer på"

Det er ikke praktisk å få dette til i C#. Det er ingen value-types du kan arve fra (annet enn indirekte fra System.ValueType) så dersom du får det til, så blir det med en reference type, noe som ikke er praktisk da det skaper en ganske kraftig 0-generasjons jobb for GC.

 

I C# er implementasjonen ganske annerledes. Genercis lager ikke masse instanser (som Lycantriphe nevner at C++ gjør) men det blir kun gjort det av Just-In-Time kompilatoren. Derfor er det viktig at dette stemmer før en engang kommer såpass langt.

 

Det er fullt mulig å skrive en slik generic add funksjon i CIL (har gjort det for å teste dette selv) men den kan slutte å funke ganske fort dersom man dytter inn feil datatyper som argumenter. Det er ingen typer, eller interfaces man kan constraine til som inneholder operatøren +. Jeg har lest at noen har fått dette til, men det er langt ifra trivielt. C# vil da hindre at dette skjer rett og slett ved å ikke tillate å skrive kode som muligens kan gå i stykker.

Lenke til kommentar

Artig, kikket litt på den artikkelen jeg refererte til og ser jo at Generic types i C# egentlig er det samme som templates i C++. Anyway, på tide at tråden faller tilbake til sitt opprinnelige tema. På tide at trådstarter begynner å spørre og grave så vi andre kan svare ;-)

 

Hehe. Jeg har enda ganske mye å lese, selvsagt kunne jeg spørt om alt jeg lurte på men jeg regner med at mye blir "oppklart" når jeg har lest igjennom diverse introduksjons materiale til div. programering språk. Det er desuten ganske interesant det som blir diskutert "off topic" :-)

 

Anyway, bruk forumet her, spør og grav. De fleste er hyggelige typer med trang til å fortelle deg hemmelighetene deres ;-) Lykke til...

 

Jeg har også lagt merke til at folk jeg har kranglet med tideligere, som jeg regner med kjenner igjen mitt nick, er meget hjelpsomme, det hadde jeg nesten ikke regnet med,hehe.

 

Men det blir nok c# eller visual basic av alle ting. Jeg hadde nok litt høye tanker om meg selv da jeg ville begynne på det mest avanserte med en gang. Dette funker nemmelig veldig godt vist man skal lære seg et innstrument, man tjener masse tid vist man har perspektiv på par - 3 år, men jeg burde jo ha skjønt at det å lære et instrument vs å programere blir som å lære å stå stille på 2 bein vs løpe 100m på under 10 sek for å sette det på spissen,hehe

 

Jeg tror jeg har lesestoff for den neste uken så jeg kommer nok til å være ganske stille en liten stund.

Men gå gjerne vekk i fra topic også, bare det dreier seg om programering generelt, myntet på en nybegynner :-)

Endret av Ruarcs
Lenke til kommentar

Jaha? Jeg leker nemmelig med tanken på å gå over på linux, men fikk noen råd om at det å begynne med nytt operativsystem sammtidig med programering var dumt. Når det skal være sagt så kan jeg jo ingenting med windows selv om mine kamerater kaller meg datakynding, er lite som skal til for det,hehe.

 

Stemmer dette at man bør kunne op man skal programere "i"? ( da burde jeg vel lære meg windows også da,hehe) Hva slags språk annbefaler dere vist man vil lage programmer som virker på både linux og windows? Men jeg har nå lest "mye" om div. språk og de er vist mere like en hva jeg trodde, så nå heller jeg mot å velge noe av det lettere først, mestre dette til en hvis grad, for så å bytte språk og heller "undo" noe av hva jeg har lært for å lære noe nytt.

Lenke til kommentar

Det er fjas at det er dumt.

 

Om man skal skrive for ting som virker (les: har god støtte. C# virker sikkert, men Mono ER ikke god støtte) har man fortsatt en mengde språk. En kjapp liste:

 

C

C++

Java

Perl

Python

Javascript (olol)

Common Lisp

Clojure, Scala (språk som kjører på JVMen, altså kan de settes sammen med Java)

Lua

Erlang

D

PHP (olol)

Haskell

Ruby

 

Fra toppen av hodet mitt.

 

Mine inntrykk av Windowsvariantene av en del av disse (begrenser seg i hovedsak til Perl + Python) er ganske røtne, men det kan jo være fordi jeg kommer fra *nix.

Endret av Lycantrophe
  • Liker 2
Lenke til kommentar

Både og. Det tekniske til siden er det absolutt en, tjah, ulempe. Lisensmessig er en ting. En annen er catch-up game til .NET-stacken. Videre kan Microsoft plutselig ombestemme seg, og da sitter man med skjegget i postkassen.

Det er jo sant. Microsoft har jo hatt den Embrace, Extend, Extinguish opplegget på gang, som sikkert er grunnen til at kun C# 2.0 faktisk er blitt standardisert.

 

Men jeg synes ikke det er en god grunn til å ikke bruke C# som et nybegynnerspråk. Det er relativt enkelt å lære, men omfattende nok til at man lærer noe nytt om det hele tiden. Det har flere forskjellige paradigmer implementert, og har flotte utviklingsverktøy tilgjengelig. Det er verdt å merke seg at C# er veldig utbredt i Norge. Jeg jobber som IT-konsulent i Oslo området, og med .NET kompetanse er det lett å selge seg inn.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...