C# Zugriff auf Membervariablen - Array

Thaxll'ssillyia

Captain
Registriert
Dez. 2007
Beiträge
3.549
Hallo Community!

Mein Programm besitzt mehrere Forms, sodass ich mich entschieden hab, eine Klasse nur für Variablen zu eröffnen.

Diese sieht zur Zeit so aus:

Code:
    public class Variables
    {
        public const int const_Max_Clients = 20;
        public static Client_properties[] m_Client = new Client_properties[const_Max_Clients];
    }

die Struktur Client_properties, aus denen der obere Array besteht, liegt neben der Klasse Variables und sieht so aus:

Code:
    public struct Client_properties
    {
        public static int Index;
        public static string Name;
        public static string PW;
        public static string Message;
        public static bool[] m_CanAddClients = new bool[Variables.const_Max_Clients];
        public static bool[] m_AddedClients = new bool[Variables.const_Max_Clients];
        public static bool[] m_AddedByClients = new bool[Variables.const_Max_Clients];
    }

Der Zugriff von außen auf zB. "Variables.const_Max_Clients" funzt einwandfrei.
Wenn ich allerdings einen Zugriff auf den Array, zb. Variables.m_Client[1].Name vornehme, kommt folgender Fehler:

Member 'Client_properties.Name' cannot be accessed with an instance reference; qualify it with a type name insteat

Was mache ich falsch?

Vielen Dank für Hilfe!

Gruß Thax
 
Zuletzt bearbeitet:
Variables.m_Client[1].Name

ja, sorry, verschrieben. Daran liegts nicht.

Ich sehe es gerade: Variables.Client_properites[1].Name muss es heißen

Aber das geht nicht, da die Struktur ja nicht in der Klasse Variables steht und imo auch nicht reingehört.
Und Client_properties ist ja kein Array, sondern eine Struktur.
Ich will mit Variables.structArray[Index].Eintrag zugreifen. Nur kapier ich den Fehler nicht.
 
Zuletzt bearbeitet:
Ich kenne mich mit C# ja nicht aus, aber wenn ich mir die Seite http://msdn.microsoft.com/de-de/library/zhcxt2bd.aspx ansehe, dann ist das doch, was du machst.
Auf den statischen Member "Member" kann nicht mit einem Instanzverweis zugegriffen werden. Qualifizieren Sie ihn stattdessen mit einem Typnamen.
Quelle: http://msdn.microsoft.com/de-de/library/zhcxt2bd.aspx
Du benutzt also Member ("m_Client") statt des Typnamen "Client_properites". Soweit wie ich das sehe. Aber ich kenne mich mit C# wie gesagt nicht aus.

Vielleicht hilft es dir trotzdem weiter.

Gruß,

badday
 
du erstellst klassenvariablen innerhalb einer struktur. klassenvariablen gibts nur ein mal in einer klasse, d.h. selbst wenn es funktionieren würde, würdest du immer nur einen wert bekommen (und das bei allen elementen).

mach das static in der struktur weg.
 
Na is doch klar

Die static-Anweisungen in Client_properties sind kompletter Unsinn...

Edit: claW. war nen Tick schneller :-)
 
ahh, das static war das Problem. Doch nun werden die Arrays, die ich in der Struktur definiere, unterstrichen, und es kommt folgender Fehler:
'Chat_Server.Client_properties.m_CanAddClients': cannot have instance field initializers in structs

Vermutlich muss der Array in der Struktur wieder statisch sein.

Code:

Code:
    public struct Client_properties
    {
        public int Index;
        public string Name;
        public string PW;
        public string Message;
        public bool[] [U]m_CanAddClients[/U] = new bool[Variables.const_Max_Clients];
        public bool[][U] m_AddedClients [/U]= new bool[Variables.const_Max_Clients];
        public bool[] [U]m_AddedByClients[/U] = new bool[Variables.const_Max_Clients];
    }

Vielen Dank für weitere Hilfe!

Gruß Thax
 
Zuletzt bearbeitet:
Thaxll'ssillyia schrieb:
Code:
    public struct Client_properties
    {
        public bool[] [U]m_CanAddClients[/U] = new bool[Variables.const_Max_Clients];
        public bool[][U] m_AddedClients [/U]= new bool[Variables.const_Max_Clients];
        public bool[] [U]m_AddedByClients[/U] = new bool[Variables.const_Max_Clients];
    }
const_Max_Clients muss hier als static deklariert werden. momentan scheinst du das ja nicht zu haben. ansonsten würde ich eher auf nen konstruktor zurückgreifen, der die elemente nach parameter erstellt.
 
const_Max_Clients muss hier als static deklariert werden.

In der Klasse Variables ist const_max_clients so definiert:

Code:
        public const int const_Max_Clients = 20;


oder meinst du was anderes?

PS: Ok, hab es jetzt hinbekommen. Hab einfach den Array als static definiert.

Ihr seid super! :) Vielen Dank!

Gruß Thax
 
Ich denke hier ist auch das Problem. Wenn du es nicht als statisch deklarierst, brauchst du ein Objekt. Daher: Mach es statisch und wie claW. gesagt hat.

Gruß,

badday
 
Thaxll'ssillyia schrieb:
Code:
        public const int const_Max_Clients = 20;
der const modifikator besagt nur, dass der wert in der klasse als konstant definiert ist. der zugriff darauf liegt aber weiterhin bei einem objekt, was heißt, dass du zuerst ein objekt der klasse erstellen musst und danach darauf zugreifen kannst. mit static dagegen ist die variable durchweg von überall ansprechbar, da diese schon ohne ein erstelltes objekt initialisiert wird und du diese, so wie jetzt geschrieben, genutzt werden kann.
 
Nein, claW., Konstanten müssen nicht explizit statisch sein hier.
In C# sind als const angegebene Member automatisch static.

http://msdn.microsoft.com/en-us/library/aa645749%28VS.71%29.aspx schrieb:
Even though constants are considered static members, a constant-declaration neither requires nor allows a static modifier.
 
Zuletzt bearbeitet:
Du kannst Konstanten einer Klasse in C# ohne eine Instanz dieser Klasse nutzen, ja.

Ach ja, gilt für .net allgemen...

Ich verstehe eh nicht, welchen Nutzen die Unterscheidung von "const" und "static const" haben sollte...
 
Zuletzt bearbeitet:
static const geht nicht, bringt ein Fehler.

@Topic:
Hab trotzdem noch einen Zugriffsfehler beim Aufruf des Strukturarrays:

Code:
 if (Variables.m_Client[k].m_CanAddClients[1] == true)

Wieder der Fehler:

Member 'Chat_Server.Client_properties.m_CanAddClients' cannot be accessed with an instance reference; qualify it with a type name instead
 
"static const geht nicht, bringt ein Fehler." <--- welche Überraschung, das sagte mein Zitat oben auch schon...

Also irgendwie verstehe ich den Code noch nicht ganz...
die Felder m_XXX - beziehen sie sich jeweils auf einen struct oder auf alle structs?
Ich würde ja sagen auf alle, dann wäre static ok... wenn nicht, ergibt das static da keinen Sinn...

Wenn du aus dem struct eine class machst, geht es auch komplett ohne statics dort...
 
Zurück
Oben