[PHP naar C#] Black Ops info opvragen (Udp, Sockets..???)

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 09-09 10:50
Hey,

Ik wil met C# (.NET) de server informatie van een Call of Duty: Black Ops server opvragen (remote console, of rcon). Ik heb geen idee waar ik moet beginnen dus heb ik maar wat gegoogled, en toen heb ik een web-based rcon gevonden die eigenlijk precies doet wat ik wil doen (en veel meer). Helaas is deze in PHP geschreven, en daar weet ik nou net helemaal niets vanaf.

De meest belangrijke php file is denk ik deze, voor zover ik kan zien regelt dit alle connecties met de remote server, en het zenden en ontvangen van informatie:
snip *

Deze code kan ik, zelfs zonder php kennis, in drie delen splitsen:
  1. 'Properties' als Host, Port en Password, inclusief de getters/setters. Dit lukt allemaal wel uiteraard.
  2. Connecten, zenden van commando's en ontvangen van informatie. Dit lukt me niet, en hier heb ik hulp bij nodig.
  3. Het parsen van de ontvangen informatie (tot op zekere hoogte, in andere files wordt nog meer geparsed denk ik). Hier heb ik misschien ook nog wel wat hulp bij nodig, maar op dit moment nog niet, ik wil eerst uberhaupt iets terug krijgen.
Ik heb een beetje rondgezocht, maar het probleem is eigenlijk dat ik niet weet hoe de connectie hier gemaakt wordt, en dat ik daar verder ook geen verstand van heb. Ik heb gegoogled op de fsockopen functie maar verder dan 'initialises a socket connection' kwam ik niet, en had ook niet echt een idee hoe ik dat in .NET zou moeten doen.

Toen vond ik de UdpClient class, en die leek wel interessant (aangezien er naar "udp://..." geconnect wordt in de php code voor zover ik kan zien), dus heb ik daar iets omheen gebouwd wat lijkt op de php code. Dit is dus mijn vertaling van de php code naar C#, voor zover ik wist wat er gebeurde:
snip *

Het 'verzenden' gedeelte is voornamelijk uit de hoge hoed getrokken. Ik zag die \xff en \x00 dingen in de php code en dacht dat dat waarschijnlijk hex characters waren ofzo (ook dat weet ik dus niet zeker) dus heb ik dat ook maar naar C# vertaald. Ik weet niet of dat klopt....

Het gedeelte met het async ontvangen komt rechtstreeks uit MSDN.

Ik gebruik dit nu als volgt:
C#:
1
2
3
            Rcon r = new Rcon("173.199.111.167", "mypassword");
            r.Connect();
            r.SendCommand("teamstatus");

"teamstatus" zou een geldig commando moeten zijn wat een lijstje met spelers terug zou moeten geven, inclusief naam, id, score, ping, etc.


Als ik dit run dan krijg ik echter nooit een response. Ik zie alleen 'listening for messages', maar verder niets. Ik heb een aantal minuten gewacht maar het lijkt erop dat de callback functie nooit aangeroepen wordt, ik krijg gewoon niets terug.

Wat doe ik nou fout? Zoals ik al zei, ik weet niets van PHP, en ook vrijwel niets van dit soort 'connecties' met Udp of whatever, dus op dit moment ben ik eigenlijk maar wat aan het proberen om iets aan de gang te krijgen. Enige hulp, al is het wat links naar relevante artikels ofzo, wordt op prijs gesteld, dan weet ik tenminste wat ik aan het doen ben... Maar op dit moment weet ik dus niet zo goed waar ik op zou moeten zoeken ofzo.

Bedankt!

[ Voor 52% gewijzigd door Woy op 15-12-2010 09:16 ]

Mijn iRacing profiel


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Zonder diep op je probleem in te gaan, zie ik wel twee aparte zaken:
* Waarom zo'n enorme post? De gehele code neerplempen komt over als een scriptrequest en neigt weinig naar het idee dat je zelf het probeert op te lossen
* Als je C# kan, moet je met de php manual echt wel uit de betekenis van de syntax komen. Zoveel verschilt het niet, slechts wat OOP beginselen + de werking van streams & sockets.

Wat wellicht kan helpen is een simpel [X/L/M]AMP server op te zetten. Daar debug je het php-script en probeer je de interne werking te doorgronden. Als dat eenmaal duidelijk is, kan je het 1-2-3 in C# omzetten :)

Acties:
  • 0 Henk 'm!

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 09-09 10:50
mithras schreef op dinsdag 14 december 2010 @ 22:51:
Zonder diep op je probleem in te gaan, zie ik wel twee aparte zaken:
* Waarom zo'n enorme post? De gehele code neerplempen komt over als een scriptrequest en neigt weinig naar het idee dat je zelf het probeert op te lossen
* Als je C# kan, moet je met de php manual echt wel uit de betekenis van de syntax komen. Zoveel verschilt het niet, slechts wat OOP beginselen + de werking van streams & sockets.

Wat wellicht kan helpen is een simpel [X/L/M]AMP server op te zetten. Daar debug je het php-script en probeer je de interne werking te doorgronden. Als dat eenmaal duidelijk is, kan je het 1-2-3 in C# omzetten :)
Ik plemp de hele code neer juist om te laten zien dat ik zelf iets geprobeerd heb... Het eerste stuk code is gewoon de php code die ik probeer te vertalen (als ik dat weglaat snapt natuurlijk niemand waar het over gaat 8)7 ), het tweede stuk code is mijn eigen vertaling, en ook die zal ik toch moeten posten om te laten weten hoe ver ik ben en wat ik al geprobeerd heb...

Mijn iRacing profiel


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
NickThissen schreef op dinsdag 14 december 2010 @ 22:58:
[...]

Ik plemp de hele code neer juist om te laten zien dat ik zelf iets geprobeerd heb... Het eerste stuk code is gewoon de php code die ik probeer te vertalen (als ik dat weglaat snapt natuurlijk niemand waar het over gaat 8)7 ), het tweede stuk code is mijn eigen vertaling, en ook die zal ik toch moeten posten om te laten weten hoe ver ik ben en wat ik al geprobeerd heb...
Dan zal ik je een andere aanwijzing geven.

Je moet eerst connecten om een command te sturen. Focus dus eerst op het eerste gedeelte. Je ziet in php dat er tijdens connecten een socket wordt geopend via fsockopen() waarna je commands kan sturen via fwrite(). Probeer uit te zoeken wat er gebeurt (dus: test het in je WAMP server en lees de manual).

offtopic:
Ik kan geen C#, dus ik kan je niet het je probleem helpen. Ik ken dit forum ondertussen wel en probeer je op die manier te helpen. Leg de focus op het juiste punt, plaats slechts datgene wat je wil vragen (dus niet alles neerplempen, daar wordt niemand blij van!) en laat zien wat je hebt geprobeerd. Dat is dan bijna garantie tot succes :)

Acties:
  • 0 Henk 'm!

  • Korben
  • Registratie: Januari 2001
  • Laatst online: 13-07 01:53

Korben

() => {};

mithras schreef op dinsdag 14 december 2010 @ 23:18:
[...]
Je moet eerst connecten om een command te sturen.
Not quite. UDP is een connectieloos protocol, dus je hoeft helemaal niet eerst te connecten. Dat dat in PHP wel zo werkt is een ander verhaal, maar met een UdpClient in C# hoeft dat dus niet.
offtopic:
Ja, ik weet dat er een Connect() methode is, maar die zet alleen de default remote host.


Ontopic: Het enige wat ik uit je code kan opmaken is dat je verwacht om een response terug te krijgen van dezelfde host op hetzelfde poortnummer als waar je naartoe zendt. Klopt dat wel? Verder, wordt je verbinding niet simpelweg geblokkeerd door een firewall?

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


Acties:
  • 0 Henk 'm!

  • DexterDee
  • Registratie: November 2004
  • Laatst online: 01:47

DexterDee

I doubt, therefore I might be

Naast wat er al gezegd is kun je wireshark gebruiken om precies te achterhalen wat je over de lijn stuurt en weer terug ontvangt. Start de capture op je netwerkkaart, filter op localhost en het ip adres waar je naartoe verbindt en je kunt precies zien wat er over de lijn gaat.

Klik hier om mij een DM te sturen • 3245 WP op ZW


Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 08-09 11:33
Is deze vraag ook van jou? http://stackoverflow.com/...e-from-udp-black-ops-rcon


Anders is het precies wat je zoekt :P.

was trouwens de eerste google hit van de eerste search die ik deed, dus het wordt tijd om je google skills te upgraden :P

[ Voor 28% gewijzigd door roy-t op 15-12-2010 08:26 ]

~ Mijn prog blog!


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ik heb de grote lappen code uit je start post verwijderd. Je hebt een nette uitgebreide start-post, maar toch verwachten we alleen relevante stukjes code. Door het probleem op te delen in kleine stukjes help je jezelf ook al een hele hoop. Dus probeer eerst eens gewoon een simpel programma die verbind en data verstuurd, en kijk met wireshark of er hetzelfde gebeurt als bij het PHP script.
WTF :X
C#:
1
2
3
4
5
bufferSend[0] = byte.Parse("255");
bufferSend[1] = byte.Parse("255");
bufferSend[2] = byte.Parse("255");
bufferSend[3] = byte.Parse("255");
bufferSend[4] = byte.Parse("02");
Waarom zou je const string literals gaan parsen? Maak er dan gewoon numeral literals van.

[ Voor 36% gewijzigd door Woy op 15-12-2010 09:20 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 09-09 10:50
roy-t schreef op woensdag 15 december 2010 @ 08:25:
Is deze vraag ook van jou? http://stackoverflow.com/...e-from-udp-black-ops-rcon


Anders is het precies wat je zoekt :P.

was trouwens de eerste google hit van de eerste search die ik deed, dus het wordt tijd om je google skills te upgraden :P
Bedankt... Ik snap niet hoe ik die niet heb kunnen vinden. :X Ik heb steeds naar 'remote console' en 'rcon' tegelijk gezocht, maar dan kreeg ik alleen posts van mensen die aan het zeuren zijn hoe gelimiteerd de 'officiele' tool is... Niet echt nuttig dus. Ik heb inmiddels een string kunnen ontvangen, het probleem lag bij het ontvangen wat net iets anders moest blijkbaar. Het lijkt nu te werken dus ik kan weer verder :)

Mijn iRacing profiel


Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 08-09 11:33
Woy schreef op woensdag 15 december 2010 @ 09:15:
Ik heb de grote lappen code uit je start post verwijderd. Je hebt een nette uitgebreide start-post, maar toch verwachten we alleen relevante stukjes code. Door het probleem op te delen in kleine stukjes help je jezelf ook al een hele hoop. Dus probeer eerst eens gewoon een simpel programma die verbind en data verstuurd, en kijk met wireshark of er hetzelfde gebeurt als bij het PHP script.


[...]

WTF :X

[...]

Waarom zou je const string literals gaan parsen? Maak er dan gewoon numeral literals van.
Eh ja, dat is wel heel erg appart :P.

~ Mijn prog blog!


Acties:
  • 0 Henk 'm!

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 09-09 10:50
roy-t schreef op woensdag 15 december 2010 @ 13:10:
[...]


Eh ja, dat is wel heel erg appart :P.
Ik heb inmiddels ook wat code voor eerdere spellen gevonden en daar wordt het ook allemaal zo gedaan... Lijkt erop dat er iemand mee begonnen is en dat de rest het gewoon overneemt.

Dit heb ik er van gemaakt, is dit netter?
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        private byte[] GetCommandBytes(string command)
        {
            var bytes = new List<Byte>();
            var xff = (Byte)255;
            var x00 = (Byte)0;
            bytes.Add(xff);
            bytes.Add(xff);
            bytes.Add(xff);
            bytes.Add(xff);
            bytes.Add(x00);

            var cmd = String.Format("{0} {1}", this.Password, command);
            bytes.AddRange(Encoding.ASCII.GetBytes(cmd));
            //bytes.Add(x00);

            return bytes.ToArray();
        }

Mijn iRacing profiel


Acties:
  • 0 Henk 'm!

  • jip_86
  • Registratie: Juli 2004
  • Laatst online: 17-09 15:19
Lastig vergelijken. Het originele stuk is weggehaald.

Acties:
  • 0 Henk 'm!

  • Flapmo
  • Registratie: April 2000
  • Laatst online: 16-09 18:56

Flapmo

and back is gigi!

jip_86 schreef op woensdag 15 december 2010 @ 14:55:
Lastig vergelijken. Het originele stuk is weggehaald.
Het originele stuk staat in de SO link. Altans, waarvan hij vraagt of het beter is.

"The purpose of computing is insight, not numbers." -- Richard Hamming


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 20:53

Haan

dotnetter

NickThissen schreef op woensdag 15 december 2010 @ 13:15:
Dit heb ik er van gemaakt, is dit netter?
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        private byte[] GetCommandBytes(string command)
        {
            var bytes = new List<Byte>();
            var xff = (Byte)255;
            var x00 = (Byte)0;
            bytes.Add(xff);
            bytes.Add(xff);
            bytes.Add(xff);
            bytes.Add(xff);
            bytes.Add(x00);

            var cmd = String.Format("{0} {1}", this.Password, command);
            bytes.AddRange(Encoding.ASCII.GetBytes(cmd));
            //bytes.Add(x00);

            return bytes.ToArray();
        }
Ik zou het eerste stukje zelf net wat anders doen (waarom een cast naar byte :? )
C#:
1
2
3
const byte xff = 255;
const byte x00 = 0;
var bytes = new List<byte> {xff, xff, xff, xff, x00};

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • Styxxy
  • Registratie: Augustus 2009
  • Laatst online: 16:49
Haan schreef op woensdag 15 december 2010 @ 15:07:
[...]
(waarom een cast naar byte :? )
Die cast naar Byte is om de volgende reden:
C#:
1
2
3
4
5
var xff = 255;
Console.WriteLine(xff.GetType().ToString()); // output: System.Int32

var xffb = (Byte)255;
Console.WriteLine(xffb.GetType().ToString()); // output: System.Byte


Voor de rest zou ik inderdaad eerder de notatie van Haan gebruiker, is korter en overzichtelijker (properder). (Weliswaar persoonlijke mening en voorkeur.)

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-09 22:43
Waarom zou een list nou
Styxxy schreef op woensdag 15 december 2010 @ 15:26:
[...]

Die cast naar Byte is om de volgende reden:
C#:
1
2
3
4
5
var xff = 255;
Console.WriteLine(xff.GetType().ToString()); // output: System.Int32

var xffb = (Byte)255;
Console.WriteLine(xffb.GetType().ToString()); // output: System.Byte


Voor de rest zou ik inderdaad eerder de notatie van Haan gebruiker, is korter en overzichtelijker (properder). (Weliswaar persoonlijke mening en voorkeur.)
Mja, je stopt iets in een List<byte> dus er zal waarschijnlijk ook wel een byte uitkomen. Jouw probleem bestaat alleen als je te lui bent om 'byte' te typen ipv 'var'.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 09-09 10:50
Ik dacht dat de cast nodig was omdat een impliciete conversie niet kon (maar misschien heb ik het mis, heb niet eens geprobeerd zonder cast).
De initializatie van de List<Byte> op jullie manier, is dat een .NET 4 feature? Doet me denken aan de 'From' statement in VB.NET (.NET 4):
code:
1
Dim lst As New List(Of Integer) From {1, 2, 3, 4}

en die had ik dus ook niet gebruikt omdat ik het in 3.5 wil houden. Maar goed, dat komt natuurlijk op hetzelfde neer, alleen wat korter.

Mijn iRacing profiel


Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Dat heeft niets te maken met de compiler. Als je Visual Studio 2010 gebruikt dan kan je zelfs het var keyword gebruiken in .NET 2.0 code.

+ list initializers konden al in 3.5 :)

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 20:53

Haan

dotnetter

NickThissen schreef op woensdag 15 december 2010 @ 15:50:
Ik dacht dat de cast nodig was omdat een impliciete conversie niet kon (maar misschien heb ik het mis, heb niet eens geprobeerd zonder cast).
Het punt is dus dat er helemaal geen conversie nodig is als je gewoon 'byte' typt ipv 'var'.
De initializatie van de List<Byte> op jullie manier, is dat een .NET 4 feature? Doet me denken aan de 'From' statement in VB.NET (.NET 4):
code:
1
Dim lst As New List(Of Integer) From {1, 2, 3, 4}

en die had ik dus ook niet gebruikt omdat ik het in 3.5 wil houden. Maar goed, dat komt natuurlijk op hetzelfde neer, alleen wat korter.
Object and Collection Initializers :)

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 16-09 15:42

Sebazzz

3dp

Styxxy schreef op woensdag 15 december 2010 @ 15:26:
[...]

Die cast naar Byte is om de volgende reden:
C#:
1
2
3
4
5
var xff = 255;
Console.WriteLine(xff.GetType().ToString()); // output: System.Int32

var xffb = (Byte)255;
Console.WriteLine(xffb.GetType().ToString()); // output: System.Byte
Om het over duidelijk programmeren te hebben, waarom zou je een getal dat 0xFF is in een constante doen die xff heet? Wat vertelt die constante nou? Niets, haal hem weg dan!

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


Acties:
  • 0 Henk 'm!

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 09-09 10:50
Sebazzz schreef op woensdag 15 december 2010 @ 17:51:
[...]

Om het over duidelijk programmeren te hebben, waarom zou je een getal dat 0xFF is in een constante doen die xff heet? Wat vertelt die constante nou? Niets, haal hem weg dan!
In mijn geval doe ik de byte in een variabele zodat ik niet vier keer dezelfde cast hoef uit te voeren. Als die cast inderdaad niet nodig is dan hoeft dat natuurlijk ook niet, maar het leek me beter om dit te doen:
code:
1
2
3
4
5
var xff = (Byte)255;
list.Add(xff);
list.Add(xff);
list.Add(xff);
list.Add(xff);

In plaats van
code:
1
2
3
4
list.Add((Byte)255);
list.Add((Byte)255);
list.Add((Byte)255);
list.Add((Byte)255);

Het zal niet veel schelen maar toch lijkt me vier keer achter elkaar dezelfde cast doen niet optimaal.

Maar zoals ik al zei, als casten niet nodig is (dat wist ik dus niet, dacht van wel) dan is dat natuurlijk onzin inderdaad.

Mijn iRacing profiel


Acties:
  • 0 Henk 'm!

  • DexterDee
  • Registratie: November 2004
  • Laatst online: 01:47

DexterDee

I doubt, therefore I might be

Sebazzz schreef op woensdag 15 december 2010 @ 17:51:
Om het over duidelijk programmeren te hebben, waarom zou je een getal dat 0xFF is in een constante doen die xff heet? Wat vertelt die constante nou? Niets, haal hem weg dan!
Ik ben geen .net programmeur, maar het voorbeeld moest toch aantonen dat het datatype van een los getal door de compiler gezien wordt als een 32 bit integer en niet als een byte, ondanks dat de waarde in een byte past.

Zonder variabele lijkt het me niet mogelijk om de getType method hierop aan te roepen en de toString om aan te tonen dat het datatype verschillend is. Of werkt deze literal constructie wel?:

code:
1
255.GetType().ToString()


/edit
\/\/ zoals ik al zei, ik ben geen .net programmeur. Grappig dat .net alle literals blijkbaar als objecten ziet :)

[ Voor 7% gewijzigd door DexterDee op 15-12-2010 18:23 . Reden: reactie op RobIII ]

Klik hier om mij een DM te sturen • 3245 WP op ZW


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
DexterDee schreef op woensdag 15 december 2010 @ 18:12:
Of werkt deze literal constructie wel?:

code:
1
255.GetType().ToString()
Ja hoor ;)
Voor veel soorten integers kun je een type suffix (tip 3) toevoegen om een bepaald type te forceren, maar bij mijn weten is er geen voor byte.
Byte has no literal type character or identifier type character.

[ Voor 46% gewijzigd door RobIII op 15-12-2010 18:26 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 16-09 15:42

Sebazzz

3dp

NickThissen schreef op woensdag 15 december 2010 @ 18:04:
[...]

Maar zoals ik al zei, als casten niet nodig is (dat wist ik dus niet, dacht van wel) dan is dat natuurlijk onzin inderdaad.
C#:
1
2
3
4
5
List<byte> test = new List<byte>();
test.Add(0xFF);
test.Add(0xFF);
test.Add(0xFF);
test.Add(0x25);
Werkt prima inderdaad, pas als je 0xFF1 of hoger doet kan het niet.

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 20:53

Haan

dotnetter

Sebazzz schreef op woensdag 15 december 2010 @ 18:45:
[...]

C#:
1
2
3
4
5
List<byte> test = new List<byte>();
test.Add(0xFF);
test.Add(0xFF);
test.Add(0xFF);
test.Add(0x25);
Werkt prima inderdaad, pas als je 0xFF1 of hoger doet kan het niet.
Ja of gewoon zo:
C#:
1
var bytes = new List<byte> {255, 255, 255, 0};

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Sebazzz schreef op woensdag 15 december 2010 @ 18:45:
Werkt prima inderdaad, pas als je 0xFF1 of hoger doet kan het niet.
offtopic:
1 hoger dan 0xFF = 0x100 ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 09-09 10:50
Bedankt, ik dacht dat de initialiser syntax .NET 4 was, blijkbaar niet, dat is inderdaad nog wat netter. Het gaat er vooral om dat het duidelijk is dat ik die 5 bytes voor de data stop, dan is het beter dat het duidelijk in de code staat in plaats van dat het een beetje tussendoor weg gewerkt is. Casten is inderdaad ook niet nodig, dus ik doe nu gewoon dit:
C#:
1
var bytes = new List<byte> {255, 255, 255, 255, 0};

[ Voor 19% gewijzigd door NickThissen op 15-12-2010 19:34 ]

Mijn iRacing profiel


Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 08-09 11:33
Waarom gebruik je de hele tijd 'var' trouwens, dat is eigenlijk iets wat alleen uitgevonden om loose typeing in linq te kunnen doen, binnen strong type C#.

Waarom niet gewoon List<byte> ipv var? Vind ik zelf handig (scheelt ook onnodige casts soms).

Toegegeven, var is wel korter.

~ Mijn prog blog!


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ik gebruik zelf nog steeds de types as intended; maar ik neig wel steeds meer naar var gebruiken. Zie ook \[C#][discussie] Lekker veel var gebruiken?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 09-09 10:50
Ik gebruik alleen var als het meteen duidelijk is welk type het zal zijn door de waarde die ik eraan toeken. Bijvoorbeeld:
code:
1
2
3
4
var lst = new List<string>();
var btn = new Button();
var lbl = (Label) this.Controls[3];
var user = UserManager.GetUserByName("Nick");


maar niet als het type niet meteen duidelijk is, bijvoorbeeld na een functie call die niet heel expliciet in de naam heeft staan wat er terug gegeven wordt. Ik vind het duidelijk genoeg (en waar ik het niet duidelijk vind gebruik ik het gewoon niet :) ), en veel makkelijker te typen, vooral bij lange type-names.

Ik vind het gewoon 'nutteloos' om helemaal het type te geven als ik twee karakters daarna gewoon (bijvoorbeeld) een nieuwe instantie van dat type ga toekennen, dat is gewoon dubbel op. Dat zou zoiets zijn als je dit doet in VB.NET (wat ik trouwens nog steeds vaak zie, maar ik vind het gewoon onzinnig):
code:
1
Dim lst As List(Of String) = New List(Of String)

dat kan ook veel korter als
code:
1
Dim lst = New List(Of String)

(of '=' vervangen door 'As' uiteraard), en dat is toch niet minder duidelijk? Nu hoef je niet twee keer vlak achter elkaar het type te tikken.


EDIT
Voor het geval het niet duidelijk is (lijkt me sterk), het gebruik van var wil niet zeggen dat je niet meer strongly typed aan het coderen bent. Het type wordt gewoon afgeleid van de waarde die je toekent. Ga maar met de muis over 'var' hangen en dan zal hij mooi "List<string>" zeggen (of Button, Label, whatever je eraan toekent). Het levert dus geen verschil op, behalve hoe je het leest natuurlijk.

[ Voor 47% gewijzigd door NickThissen op 15-12-2010 21:32 ]

Mijn iRacing profiel


Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 16-09 15:42

Sebazzz

3dp

Ik gebruik var voor als je "lange types" hebt, Zoiets als IQuerable<IEnumerable<SomeObject>. Of Dictionary<string,List<SomeObject>>. Toch probeer ik zo veel mogelijk expliciet te zijn.

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


  • Korben
  • Registratie: Januari 2001
  • Laatst online: 13-07 01:53

Korben

() => {};

Wel heel erg off-topic enzo, maar ik gebruik persoonlijk var als:
  1. Het type anoniem is (dan moet je wel)
  2. Het type belachelijk lang is (Lazy<IFactory<IBla<IFoo>>> bijvoorbeeld)
  3. Het type in de initializer staat:
    C#:
    1
    
    var bytes = new List<byte>();
roy-t schreef op woensdag 15 december 2010 @ 21:06:
Waarom niet gewoon List<byte> ipv var? Vind ik zelf handig (scheelt ook onnodige casts soms).
Wanneer scheelt het expliciet gebruiken een cast t.o.v. var? Als je old-school enumerators gebruikt? Ik gebruik dan altijd een Cast<T>().

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?

Pagina: 1