Autor Beitrag
Xardas008
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 149

Win 7 Professional x64, Ubuntu 10.04, Windows Server 2008 R2
C#, Visual Studio 2008 Pro, Visual Studio 2010 Ultimate, Eclipse (Java)
BeitragVerfasst: Di 14.10.08 20:03 
Hallo Programmierer,

folgendes Problem habe ich: Ich bin gerade dabei, meine C# Kenntnisse zu vertiefen und bin nun auf die Strukturen gestoßen.

In dem Buch steht, dass es 2 Möglichkeiten gibt, auf Strukturen zuzugreifen.

1. Möglichkeit, ich initialisiere sie mit dem Schlüsselwort new wie auch schon bei Klassen gewohnt

2. Möglichkeit, ich deklariere die lokale Variable, und greife direkt auf die Member drauf zu.

Und hier ist mein Problem, aber am besten liefere ich dazu erstmal den Code:
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:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
    class Program
    {
        static void Main(string[] args)
        {
            Coords myCoords;
            myCoords.X = 15;
            myCoords.Y = 16;
            myCoords.Z = 20;
            myCoords.WriteCoords();
            Console.ReadLine();
        }
    }

    public struct Coords
    {
        private int x;
        private int y;
        private int z;

        public int X
        {
            get
            {
                return this.x;
            }
            set
            {
                this.x = value;
            }
        }

        public int Y
        {
            get
            {
                return this.y;
            }
            set
            {
                this.y = value;
            }
        }

        public int Z
        {
            get
            {
                return this.z;
            }
            set
            {
                this.z = value;
            }
        }

        public void WriteCoords()
        {
            Console.WriteLine("X: {0}"this.x);
            Console.WriteLine("Y: {0}"this.y);
            Console.WriteLine("Z: {0}"this.z);
        }

    }

So, wenn ich das ganze versuche zu kompilieren, gibt es folgende Fehlermeldung:
Verwendung der nicht zugewiesenen Variablen myCoords (Z. 12).
Wieso? Ich habe dieses Programm abgesehen der Methode WriteCoords 1:1 aus dem Buch abgetippt.
(Falls nun die Frage aufkommt, um welches Buch es sich denn handle, es ist das Buch Visual C# 2005 von Frank Eller aus dem Addison-Wesley Verlag)

Gehe ich hin und mache folgendes in der Main-Methode, dann geht es:
ausblenden C#-Quelltext
1:
Coords myCoords = new Coords();					


In diesem falle würden in meinen Augen Strukturen aber gar keinen Sinn ergeben, da sie ja dann genauso arbeiten würden wie eine Klasse auch.
Skiller-1988
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 100

Win XP | Debian | Ubuntu
C# | PHP | VB.NET
BeitragVerfasst: Mi 15.10.08 07:36 
Hi,
warum das jetzt in dem Buch so steht Verstehe ich auch nicht...
Allerdings denke ich zu wissen wo das Problem liegt nämlich in der initalisierung der Variablen.

MSDN Verwendung von Strukturen
Zitat:

Wird new nicht verwendet, werden die Felder nicht zugewiesen, und das Objekt kann erst verwendet werden, nachdem alle Felder initialisiert wurden.

_________________
~ Wer Rechtschreibfehler findet darf sie behalten ~
Xardas008 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 149

Win 7 Professional x64, Ubuntu 10.04, Windows Server 2008 R2
C#, Visual Studio 2008 Pro, Visual Studio 2010 Ultimate, Eclipse (Java)
BeitragVerfasst: Mi 15.10.08 16:04 
Hallo Skiller,

habe mir mal die Hilfe die du da gepostet hast durchgelesen.
Wenn du dir das Beispiel 2 genauer anschaust, siehst du, dass ich es genau so gemacht habe. Nur bei mir beschwert er sich.

Jetzt hab ich aus jux mal folgendes ausprobiert:

ausblenden C#-Quelltext
1:
2:
3:
myCoords.x = 12;
myCoords.y = 13;
myCoords.z = 14;

Die Zahlen sind grade einfach erfunden, spielen ja eh keine Rolle. Und schon meckert der Compiler nicht mehr.

Der Clou an der Sache, x, y und z sind private und NICHT!!! public deklariert. Somit verletze ich hier ja das Prinzip der Datenkapselung (dazu habe ich ja extra die Eigenschaften implementiert).
Das kann doch irgendwo nicht sein oder?
Ich mein, in diesem Falle geht der Sinn von private total verloren, weil ich von ausserhalb der Struktur ohne Probleme drauf zugreifen kann.

EDIT:
Ok das mit dem private hab ich rausgefunden, ich hab die Main-Methode innerhalb der Struktur definiert, somit ist ein Zugriff auf die private-Felder doch erlaubt.

Jetzt die Entscheidende Frage: Ist es denkbar, dass ich, wenn ich Struktur-Felder als private deklariere und entsprechende Eigenschaften implementiere, nicht ohne new auskomme? Weil das ist gerade meine Vermutung weil mit funktioniert es, da die Felder dann ja initialisiert werden, das würde zumindest die Fehlermeldung erklären.
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Do 16.10.08 12:37 
user profile iconXardas008 hat folgendes geschrieben Zum zitierten Posting springen:
In diesem falle würden in meinen Augen Strukturen aber gar keinen Sinn ergeben, da sie ja dann genauso arbeiten würden wie eine Klasse auch.
Ob du new aufrufst oder nicht, ändert eigentlich nichts, vor allem wird eben in keinem der Fälle eine Instanz auf dem Heap erstellt; das passiert nur bei Klassen.
Eine Richtlinie für Structs vs. Classes: Verwende eine Struktur nur dann, wenn sie immutable und "klein"[meta]sagen wir einmal: höchstens vier Felder[/meta] ist.

_________________
>λ=
Skiller-1988
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 100

Win XP | Debian | Ubuntu
C# | PHP | VB.NET
BeitragVerfasst: Do 16.10.08 12:59 
@ Xardas008
sorry ich glaube du hast meinen post nicht zu 100% verstanden, also wenn ich mir deinen post genauer anschaue sehe ich eben nicht das du genau dass gemacht hast meiner meinung nach initalisierst du deine Variablen nicht bevor du versuchts mit den Properties darauf zu zugreifen. Sprich du weist ein den Variablen über die Properties einen Wert zu bevor du die Variablen initalisiert hast.
Wenn du es so versuchst wie du es aus jux gemacht hast müssten dann anschließend auch die Proberties funktionieren.
ausblenden C#-Quelltext
1:
2:
3:
myCoords.x = 12;
myCoords.y = 13;
myCoords.z = 14;

_________________
~ Wer Rechtschreibfehler findet darf sie behalten ~
Xardas008 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 149

Win 7 Professional x64, Ubuntu 10.04, Windows Server 2008 R2
C#, Visual Studio 2008 Pro, Visual Studio 2010 Ultimate, Eclipse (Java)
BeitragVerfasst: Fr 17.10.08 10:23 
user profile iconSkiller-1988 hat folgendes geschrieben Zum zitierten Posting springen:
@ Xardas008
sorry ich glaube du hast meinen post nicht zu 100% verstanden, also wenn ich mir deinen post genauer anschaue sehe ich eben nicht das du genau dass gemacht hast meiner meinung nach initalisierst du deine Variablen nicht bevor du versuchts mit den Properties darauf zu zugreifen. Sprich du weist ein den Variablen über die Properties einen Wert zu bevor du die Variablen initalisiert hast.
Wenn du es so versuchst wie du es aus jux gemacht hast müssten dann anschließend auch die Proberties funktionieren.
ausblenden C#-Quelltext
1:
2:
3:
myCoords.x = 12;
myCoords.y = 13;
myCoords.z = 14;


Das Problem ist, du kannst private-Felder nicht initialisieren wenn du nicht über die Propertie drauf zugreifst.
Und im Prinzip war meine Zuweisung (auch wenns über die Propertie war) ja eine Initialisierung, ich hab den Inhalt ja gesetzt und nicht abgerufen.