Entwickler-Ecke

Basistechnologien - zugriff auf enum in struct von click event handler


CSMN - Mi 01.09.10 23:42
Titel: zugriff auf enum in struct von click event handler
hallo,

wenn ich in einen struct ein enum deklariere und das struct dann in einen button click event instanziiere dann kann ich nicht direkt
das vierte argument als Person.Genders.Mann verwenden. ich bekomme dort die fehlermeldung, dass die lokale Variable Person erst verwendet werden kann nachdem sie deklariert wurde.


C#-Quelltext
1:
Person P2 = new Person("Heino""Brecht"2, Person.Genders.Mann);                    


wenn ich das ganze aber in einen konsolenprogramm ausführe läuft es wunderbar. wo liegt mein fehler? was habe ich nicht beachtet? und wieso ist das verhalten so unterschiedlich?

besten dank
csmn

achso, im struct ist alles als public modifiziert...

Moderiert von user profile iconChristian S.: Überflüssige Zeilenumbrüche entfernt
Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt


Christian S. - Mi 01.09.10 23:45

Ich glaube, nur mit dem Codeschnipsel kann man das schwer sagen. Kannst Du mal die Deklaration des Enums zeigen? Ist das Enum selber als public deklariert?


CSMN - Do 02.09.10 00:10

user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:
Ich glaube, nur mit dem Codeschnipsel kann man das schwer sagen. Kannst Du mal die Deklaration des Enums zeigen? Ist das Enum selber als public deklariert?



C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
 public struct Person
    {
        public string firstName;
        public string lastName;
        public int age;
        public Genders gender;


        public Person(string _firstName, string _lastName, int _age, Genders _gender)
        {
            this.firstName = _firstName;
            this.lastName = _lastName;
            this.age = _age;
            this.gender = _gender;
        }

        public override string ToString()
        {

            return firstName + " " + lastName + " (" + gender + ") , Alter: " + age;

        }

        public enum Genders { Mann, Frau };

    }


Yogu - Do 02.09.10 13:17

user profile iconCSMN hat folgendes geschrieben Zum zitierten Posting springen:
ich bekomme dort die fehlermeldung, dass die lokale Variable Person erst verwendet werden kann nachdem sie deklariert wurde.

Das heißt, du hast zusätzlich zum Klassennamen Person noch eine lokale Variable Person irgendwo definiert. Um solche Fehler zu vermeiden, solltest du lokale Variablen (und Parameter) immer klein schreiben.


CSMN - Do 02.09.10 17:36

user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconCSMN hat folgendes geschrieben Zum zitierten Posting springen:
ich bekomme dort die fehlermeldung, dass die lokale Variable Person erst verwendet werden kann nachdem sie deklariert wurde.

Das heißt, du hast zusätzlich zum Klassennamen Person noch eine lokale Variable Person irgendwo definiert. Um solche Fehler zu vermeiden, solltest du lokale Variablen (und Parameter) immer klein schreiben.


hi, nein ich habe keine lokale variable person. ich habe lediglich das struct so wie oben angezeigt geschrieben und im click event handler wollte ich mir die instanz mit


C#-Quelltext
1:
Person P2 = new Person("Heino""Brecht"2, Person.Genders.Mann);                    


erzeugen, wobei der fehler direkt auf Person.Genders.Mann zeigt mit der besagten fehlermeldung. und da dass ganze in einen konsolenprogramm einwandfrei läuft verwundert es micht halt bzw. sehe ich den fehler nicht.


CSMN - Fr 03.09.10 02:29

vielleicht noch jemand eine idee wo der fehler liegt?
thx,
csmn


danielf - Fr 03.09.10 07:25

Hallo,

da ich mit struct normalerweise nicht arbeite frage ich mich, warum du struct verwendest? und warum du dann innerhalb des struct ein Enum definiertst (MSDN [http://msdn.microsoft.com/de-de/library/ah19swz4%28VS.80%29.aspx]).

Hat das besondere Gründe? Warum nimmst du keine Klasse, damit sollte es gehen?

Gruß

PS: Das enum und die Eigenschaft sollte Gender heißen. Öffentliche Member sollte man auch nicht verwenden sondern besser eine Eigenschaft/Property.


CSMN - Fr 03.09.10 08:05

user profile icondanielf hat folgendes geschrieben Zum zitierten Posting springen:
Hallo,
da ich mit struct normalerweise nicht arbeite frage ich mich, warum du struct verwendest? und warum du dann innerhalb des struct ein Enum definiertst. Hat das besondere Gründe? Warum nimmst du keine Klasse, damit sollte es gehen?


hi,

also vorteilhaft ist die anwendung eines structs, weil diese unter gewissen bedingungen eine bessere performance bringen als klassen. das trifft auf das obige struct zwar nicht zu aber wenn man nur value typen hat und sizeof der instanz <= 16 byte ist dann sollte man nen struct anstatt eine klasse verwenden. ansonsten kann man ja auch einfach die keywords struct gegen class austauschen. hintergrund ist die frage warum das in der konsole läuft und warum nicht in einer form? ist also mehr experimenteller natur. und ja über user-scoped propertys wäre es im realen einsatz natürlich besser gelöst, da hast du völlig recht.

gruß


Yogu - Fr 03.09.10 11:14

Hallo,

die Fehlermeldung sagt eigentlich eindeutig aus, dass eine nicht initialisierte lokale Variable namens Person existiert. Wenn das bei dir nicht der Fall ist, dann hast du hier einen Fehler im C#-Compiler entdeckt. Glückwunsch :?

Um den Fehler zu umgehen, könntest du die Enum-Deklaration aus dem Struct heraus direkt in den Namespace verlegen.

Grüße,
Yogu


CSMN - Fr 03.09.10 12:49

Hey,

sorry, war mein Fehler - hatte was übersehen gehabt :roll:
funktioniert nun alles wie es sollte...