Autor Beitrag
C#David
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: Mi 25.04.18 10:58 
Hey Leute,

ich möchte in der Main-Funktion der Klasse "Program" die Werte von einer Struct "Teststruct" ausgeben. Den Membern der Struct werden definitionsgemäß vorab bestimmte Werte zugewiesen und durch Aufruf der Funktion "AufrufStruct()" überschrieben. Auch wenn ich in der abgeleiteten Klassen explizit nochmal ein Objekt "TS" der Struct erstelle, erscheint beim Abfragen des Inhaltes die Fehlermeldung:
Zitat:
"Fehler 1 Verwendung des möglicherweise nicht zugewiesenen Felds "testbit1".

Was mache ich verkehrt? Vielen Dank für eure Hilfe!

Das Minimalprogramm:
ausblenden volle Höhe 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:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
namespace Testprogramm
{
    public class TestKlasse
    {
        public struct Teststruct
        {
            public bool testbit1=false;
            public bool testbit2=false;           
        };

        Teststruct TS = new Teststruct();

        public Teststruct AufrufStruct()
        {
            TS.testbit1= true;
            TS.testbit2= true;
            return TS;
        }       
    }    
    
    static class Program: TestKlasse
    {
        /// <summary>
        /// Der Haupteinstiegspunkt für die Anwendung.
        /// </summary>
        [STAThread]
        static void Main()
        {
            TestKlasse TK = new TestKlasse();
            TK.AufrufStruct();

            Teststruct TS;

            Console.WriteLine("Das Testbit1 hat den Wert", TS.testbit1);            
        }
    }}


Moderiert von user profile iconTh69: Titel geändert.
Moderiert von user profile iconTh69: Quote-Tags hinzugefügt
Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 25.04.18 11:30 
Zitat:
Was mache ich verkehrt? Vielen Dank für eure Hilfe!


Fast zuviel um allem nachzugehen. Ich versuchs trotzdem ;) Die Liste ist aber vermutlich nicht vollständig.

a.) Du kannst in einem struct nicht einfach Felder initialisieren. In einem struct haben alle Felder erstmal immer ihren default Wert. Wenn du eine Initialisierung eines structs willst solltest du einen entsprechenden parametrierten Konstruktor schreiben und die Initialwerte explizit übergeben.

b.) Bei einer inneren Klasse(oder struct) mußt du wenn du sie von außerhalb ansprechen willst den ganzen Namen also inclusive des Namens der äußeren Klasse angeben (ähnlich wie einen Namespace).
Also "TestKlasse.Teststruct" nicht nur "Teststruct". Später könntest du dafür ein static using definieren aber das solltest du erst tun wenn du alles mögliche andere vorher verstanden hast.

c.) Beim Console.Writeline mußt du für die Argumente die im text auftauchen sollen auch Platzhalter vergeben (das Ding mit den {}-Klammern und dem Index), oder gleich einen interpolierten string verwenden.

d.) AufrufStruct() liefert dir einen kopierten struct den verwendest du aber nicht sondern erzeugst (beser du versuchst einen zu erzeugen weil das was du gerade tust nicht kompiliert) einfach einen neuen. "TestStruct TS" erzeugt dir einen neuen leeren struct mit den Defaultwerten für die beiden Felder.

Der letzte Punkt ist die Ursache des von dir beobachteten Compilerfehlers. Da TS einfach neu erzeugt wurde ist keins seiner Felder initialisiert. Das muß irgendwo explizit passieren wie zum Beispiel beim struct den du aus der AufrufStruct() Methode bekommst.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 25.04.18 12:48 
Und auch die Ableitung der Klasse Program von TestStruct ist nicht möglich (aus 2 Gründen: statische Klassen können nur von Object erben und Strukturen selbst können nicht vererbt werden), s.a. Fehlermeldungen bei Ideone-Code.

Edit: Ups, du hast ja von TestKlasse abgeleitet - trotzdem gilt hier der erste Grund.


Zuletzt bearbeitet von Th69 am Mi 25.04.18 16:21, insgesamt 3-mal bearbeitet
C#David Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: Mi 25.04.18 13:24 
Okay das erklärt einiges. Habe mein Programm jetzt nämlich mal umgeschrieben:


ausblenden volle Höhe 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:
27:
28:
29:
30:
31:
32:
33:
    public class TestKlasse
    {
        public struct Teststruct
        {
            public bool testbit1=false;
            public bool testbit2=false;           
        };

        Teststruct TS = new Teststruct();

        public Teststruct AufrufStruct()
        {
            TS.testbit1= true;
            TS.testbit2= true;
            return TS;
        }       
    }    
    
    static class Program: TestKlasse
    {
        /// <summary>
        /// Der Haupteinstiegspunkt für die Anwendung.
        /// </summary>
        [STAThread]
        static void Main()
        {
            TestKlasse TK = new TestKlasse();
            TK.AufrufStruct();            

            Console.WriteLine("Das Testbit1 hat den Wert: {0}", TestKlasse.Teststruct);
        }
    }
}


Auch hier kommt nen Fehler: Fehler1 "... .TestKlasse.Teststruct" ist "Typ" und im angegebenen Kontext nicht gültig. "

Wie könnte ich das Problem umgehen...also die Variablen "testbit1" und "testbit2" mit in die abgeleitete Klasse nehmen? Besten Dank!

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 25.04.18 15:45 
Udn warum benutzt du den Typ an der Stelle wo du ihn benutzt hast?
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 25.04.18 16:27 
Hallo C#David,

darf ich fragen, womit du lernst (Buch, Tutorial, ...)? Denn da ist so einiges im Argen.
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Mi 25.04.18 17:43 
Das sieht ein bisschen so aus, als würde David ausschließlich mit Hilfe von Google bzw. Foren-Beiträgen lernen.
Das ist aber keine gute Idee, weil beinahe alle solche Quellen auf gewisse Vorkenntnisse aufbauen, die eignen sich nicht für einen Anfang bei 0.

Besser ist ein Buch wie dieses:
openbook.rheinwerk-v.../visual_csharp_2012/
C#David Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: Mi 25.04.18 20:30 
Habe mich über in letzter Zeit tatsächliche über diverse Foren belesen und werde parallel jetzt ein Buch durcharbeiten:
"C#6 mit Visual Studio 2015".
Ich dachte, dass ich die Struct wie ein Namespace auch ansprechen kann?? Wie ist es richtig? Vielen Dank!
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 25.04.18 20:41 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Do 26.04.18 09:56 
Stimmt schon, dass man auch mit Hilfe von Foren lernen kann, aber ist das dann nicht eher ein Verdienst der einzelnen Leute im Forum, die aktiv lehren? Das ist nicht unbedingt selbstverständlich ^^

Zitat:
Ich dachte, dass ich die Struct wie ein Namespace auch ansprechen kann??

Das geht schon, ist aber ganz sicher nicht der richtige Weg und sehr weit vom eigentlich Ziel und Sinn von nested Classes/Structs entfernt :D

Eine nestes Class/Struct (so heißt das nämlich) sollte man nur dann nutzen, wenn die Klasse/Struktur gar nicht für Außerhalb gedacht bzw. geeignet ist.
Manchmal macht man das aber auch, weil die nested Class die private Inhalte der äußeren Klasse "sehen" darf. Auf diese Weise kann eine Klasse eine Funktion anbieten, die bestimmte Informationen braucht, die ansonsten nicht nach außen sichtbar sein dürfen.
Warum verwendest Du nicht direkt Namespaces? Die sind ja genau für dein Anwendungsfall gedacht.

Aber allgemein solltest Du dir abgewöhnen, Structs zu verwenden. Die lohnen sich nur in sehr wenig Fällen und die wenigen Fälle, die ich kenne, sind alle im .NET-Framework :D
Was Du nutzen solltest, sind Klassen. Die Objekte einer Klasse verhalten sich in einigen Punkten anders als die Werte (nicht Objekte) eines Structs (Stichwort: Referenz-Typ).
In den aller, aller meisten Fällen ist es besser, pauschal eine Klasse zu verwenden, denn später kann man ja immer noch umstellen, falls es aus irgendeinem Grund notwendig sein sollte.