Toon posts:

[C#] Array van zelf gemaakte classes

Pagina: 1
Acties:

Verwijderd

Topicstarter
'k heb zelf een class gemaakt genaamd Connection, en ik wil van deze class een array hebben. Dus heb ik ergens in m'n code neergezet:
code:
1
2
private int OpenSockets;
private Connection[] Connections;

Vervolgens zet ik ergens later in m'n code het volgende neer:
code:
1
2
OpenSockets++;
Connection[OpenSockets] = new Connection(InterlinkXPServer.AcceptTcpClient());

Het leek me dat dat wel ging werken, maar nu krijg ik een Object reference not set to an instance of an object exception. En als ik m'n project compile dan zegt de compiler dat Field '...Connections' is never assigned to, and will always have it's default value null.

Ik heb begrepen dat ik al in de declaratie van de array een new moet neerzetten, maar dat wil ik niet, want dan klopt de code die ik wil hebben niet meer. Iemand die me kan uitleggen hoe dit in elkaar zit?

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 09-09 20:58

Janoz

Moderator Devschuur®

!litemod

Kijk er zelf nog ff goed naar.. Ik zie 3x zonder s en 1x met s, Volgens mij mis je ergens een s :)...

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Topicstarter
Hmmz, had de code niet geC&P't.

De goede code is dus:
code:
1
2
private int OpenSockets;
private Connection[] Connections;

en verderop in 't zelfde file:
code:
1
2
OpenSockets++;
Connections[OpenSockets] = new Connection(InterlinkXPServer.AcceptTcpClient());

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 09-09 11:02
Ik ken C# niet, dus misschien is het onzin, maar in de meeste talen (zoals ook Java bijvoorbeeld) heeft een array een vaste grote, in verband met efficientie. Dit betekend dus dat je inderdaad van te voren je array moet initialiseren met een zekere grootte. Dit betekent ook dat je geen elementen meer kan toevoegen aan het einde van de array. Meestal kun je wel een redelijk maximum instellen en daarvoor ruimte reserveren, maar als dat niet kan, zul je een object moeten gebruiken dat een variabele hoeveelheid elementen kan bevatten.

In Java gaat het hierbij om klassen als Vector, LinkedList, etc. In C# zul je ook wel zoiets hebben.

Sowieso zou je kunnen weten dat jou code niet kan kloppen. Alle variabelen die je declareert, moeten immers geinitialiseerd worden alvorens je ze kan gebruiken. Jij declareert Connections wel, initialiseert 'm nergens en probeert 'm toch te gebruiken. Dat is in een taal als C# vrijwel nooit goed en daar waarschuwt de compiler dan ook voor.

Tenslotte is het gebruikelijk om in talen als Java en C# klassen met een hoofdletter te beginnen (zoals je inderdaad doet) maar variabelen (net als attributen en methoden) met een kleine letter, zodat het onderscheid tussen klassen en variabelen duidelijker is.

Verwijderd

Topicstarter
Hmmz, ik kan in ieder geval wel een string array maken zonder vaste grootte met:
code:
1
private string[] <naam>;

Daar doet ie volgens mij niet moeilijk over. Wat betreft het feit dat ik hem niet initialiseer. Op het moment dat ik de new functie aanroep moet ik een parameter opgeven, om precies te zijn een System.Net.Sockets.TcpClient. Dus ik kan niet het volgende doen:
code:
1
private Connection[] Connections = new Connection();

Dan krijg ik overigens twee foutmeldingen. Punt een, ik moet dus die parameter opgeven, en punt twee, kan die Connection niet converten naar Connection[].

Ennuhm, 'k ben nog redelijk newbie in C#. Heb al wel veel gedaan in VB6 en VB.NET.

  • hopakee
  • Registratie: December 2001
  • Laatst online: 25-01-2023
code:
1
2
private int OpenSockets;
private Connection[] Connections;


code:
1
2
OpenSockets++;
Connection[OpenSockets] = new Connection(InterlinkXPServer.AcceptTcpClient());
Is het niet:

Connections[OpenSockets] = ......
let op de s!

Verwijderd

Topicstarter
Mjah, hopakee, dat poste ik net al. 'k had die code niet geC&P't.

  • hopakee
  • Registratie: December 2001
  • Laatst online: 25-01-2023
Op dinsdag 02 april 2002 14:51 schreef jmezach het volgende:
Mjah, hopakee, dat poste ik net al. 'k had die code niet geC&P't.
Ja was nog bezig met postje tikken.

Verwijderd

Topicstarter
Maar goed, wat ik dus eigenlijk wil is het volgende:

Een gebruiker maakt een verbinding met de server. Op het moment dat dat gebeurdt moet de server de verbinding accepteren. En ik wil dus alle verbindingen bijhouden in een array van een class. Maar op deze manier werkt dat blijkbaar niet, maar hoe moet ik het dan wel doen???

Verwijderd

Kan je geen gebruik maken van een collectie? Is veel netter :).

Verwijderd

Topicstarter
Mjah, daar heb ik ook ffies naar gekeken. Maar 'k begrijp niet helemaal hoe dat in elkaar zit. Enig idee hoe ik dat voor elkaar moet krijgen? 'k geloof da'k ICollection moet implementen, maar hoe en wat?

Verwijderd

Topicstarter
Hmmz, 'k heb nu ArrayList geinherited. Maar ik kan hier nog steeds niet mee wat ik er eigenlijk mee wil. Zo moeilijk kan het toch niet zijn?

Verwijderd

Zoiets?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
uses System.Collections;

class Test
{
   private int OpenSockets = 0;
   private ArrayList Connections = new ArrayList();

   public void DoIets()
   {
    OpenSockets++;
    Connections.Add(new Connection(InterlinkXPServer.AcceptTcpClient()));
   }
}

Merk op dat OpenConnections niet nodig is omdat de grootte (aantal items in Connections) altijd op te vragen is met Connections.Count

Verwijderd

Topicstarter
Hmmz, maar waar blijft m'n eigen gemaakt class dan?
Die komt hier toch niet in terug?

Verwijderd

Op dinsdag 02 april 2002 16:38 schreef jmezach het volgende:
Hmmz, maar waar blijft m'n eigen gemaakt class dan?
Die komt hier toch niet in terug?
In een ArrayList gooi je dingen van het type Object, dus daar kun je jou Connection type ook in gooien, als je ze er uit haalt moet je ze wel weer naar een Connection terug casten (tenminste zolang C# geen generics ondersteund).

Verwijderd

Topicstarter
Oh, wacht ffies, 'k had je code nog niet helemaal goed gelezen. 'k ga het eens ffies uitproberen. Bedankt tot zover i.i.g.

Verwijderd

Topicstarter
Zo te zien werkt dit wel. Maar het volgende probleem staat alweer voor de deur. Maar ik denk da'k dat wel kan fixen.

Trouwens, ik heb nu de volgende code gebruikt:
code:
1
2
int newid = Connections.Add(new Connection(InterlinkXPServer.AcceptTcpClient()));
((Connection)Connections[newid]).SendWelcome();

SendWelcome is natuurlijk een void in de Connection class.

  • Yannick
  • Registratie: December 2000
  • Laatst online: 17-07 17:03

Yannick

Bub MC

Maak er dit van:
private static Connection[] Connections;
Hoef je hem niet eerst te instantieeren.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 09-09 22:48

.oisyn

Moderator Devschuur®

Demotivational Speaker

Collections zou idd een betere oplossing zijn, maar om even terug te gaan naar je echte probleem: je array is (waarschijnlijk) nog niet gedefinieerd. Ik ben verder geen kenner van C#, maar je zult denk ik eerst de array moeten alloceren alvorens je de connections vult

Zoiets dus:

Connection[] connections = new Connection[10];

connections is nu een array van 10 elementen, nu kun je gewoon element 0 t/m 9 assignen, dus hierna:

connections[0] = new Connection (blaat);

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Hmmz, met die ArrayList werkt het perfect. Ik vraag me alleen een ding wel af. Als ik nu mijn class Serializable maak en vervolgens met een BinaryFormatter naar een file serialize en later weer laat of ik dan ook alle classes in die ArrayList weer terug krijg.
Pagina: 1