struct



  • Hallo,

    Frage 1:

    lege ich ein struct global an, werden die Elemente mit 0 initalisiert. Lege ich es lokal an , geschicht das nicht. Warum ist das so ?

    Frage 2:

    sagen wir das struct hat 10 Elemente die aber alle int sind. Gibt es eine möglichkeit diese durchzuiterieren ? Oder muss ich wirklich jedes Element einzeln aufrufen und es mit dem gewünschten Wert belegen ?

    Frage 3:

    Was ist der Unterschied zwischen einem struct das nicht mit new angelegt wurde und einem das mit new angelegt wird ? Ich kann beidesmal auf die Elemente zugreifen.



  • bist du im richten forum gehts wirklich um strukturen in .net c#?



  • ja es geht um c Sharp. In C++ muss du structuren ja immer initalisieren .



  • Nö musst du nicht und sowas wie globale Variablen gibts in C# nichtmal...



  • du musst sie nicht initalisieren, aber es steht halt Müll drin. Aber wie gesage in Csharp hab ich eine variable außerhalb einer Methode angelegt und dort ist jedes Element mit 0 initalisiert. Setze ich dieselbe Variable aber in eine Methode rein, meckert er ich müßte sie initaliseren.



  • Ok, und was genau wundert dich daran nun? Überleg mal, was es in C# genau bedeutet, wenn du eine Variable "außerhalb einer Methode" anlegst...



  • blurry333 schrieb:

    Frage 1:

    lege ich ein struct global an, werden die Elemente mit 0 initalisiert. Lege ich es lokal an , geschicht das nicht. Warum ist das so ?

    1. Du solltest deine Begrifflichkeiten mal ändern. Es gibt keine globalen Variablen in C#, was du meinst sind wohl Instanz- oder Klassenvariablen (static).

    2. Strukturen in C# sind als sehr leichtgewichtige Alternativen zu Klassen gedacht, dazu gehört auch das auf eine Initialisierung in einigen Fällen verzichtet wird. Um mal die MSDN zu zitieren:

    <a href= schrieb:

    MSDN">...When you create a struct object using the new operator, it gets created and the appropriate constructor is called. Unlike classes, structs can be instantiated without using the new operator. In such a case, there is no constructor call, which makes the allocation more efficient. However, the fields will remain unassigned and the object cannot be used until all of the fields are initialized...

    blurry333 schrieb:

    sagen wir das struct hat 10 Elemente die aber alle int sind. Gibt es eine möglichkeit diese durchzuiterieren ?

    Nicht direkt, wenn kannst du dies indirekt über Reflection lösen (was aber der Performance abträglich sein könnte).

    blurry333 schrieb:

    Was ist der Unterschied zwischen einem struct das nicht mit new angelegt wurde und einem das mit new angelegt wird ? Ich kann beidesmal auf die Elemente zugreifen.

    Siehe das obige Zitat aus der MSDN. Ich hoffe aber du weist um den Unterschied zwischen struct und class in C# (Die Unterschiede sind wesentlich, im Gegensatz dazu wie es in beispielsweise C++ ist).



  • Das wundert mich sowieso .

    In C# gibt es keine globalen Variablen und es gibt auch keine header.

    Was in C++ seinen Sinn ergibt , lässt man in C# einfach weg ?



  • Wenn du denkst das Header einen Sinn ergeben, dann musst du wirklich noch viel lernen.

    Probier das mal: lernen.
    Ist doof, ich weiss. Aber lernen hilft zu verstehen. Ist doof, ich weiss. Aber probiers mal. In der Grundschule hats ja auch geklappt.



  • Sie geben eigentlich keinen Sinn. Dann könnte man sie doch auch in C++ abschaffen ?



  • Sie machen in C++ absolut Sinn, C# verfolgt aber ein anderes Build Model. Es gibt allerdings Bestrebungen, das C++ Build Model zu ändern...



  • dot schrieb:

    Sie machen in C++ absolut Sinn

    Sie ergeben in C Sinn. In C++ schon weniger. Eigentlich sogar noch weniger als in C#, weil in C# reichen Deklarationen aus, im Gegensatz zu C++ Templates.



  • sinnmacher schrieb:

    dot schrieb:

    Sie machen in C++ absolut Sinn

    Sie ergeben in C Sinn. In C++ schon weniger. Eigentlich sogar noch weniger als in C#, weil in C# reichen Deklarationen aus, im Gegensatz zu C++ Templates.

    Sry, das versteh ich nicht, kannst du mir das genauer erklären?



  • dot schrieb:

    Sry, das versteh ich nicht, kannst du mir das genauer erklären?

    Das ist auf C# als Sprache bezogen, nicht auf die .Net Umsetzung.

    In C# könnte man problemlos einführen, dass alle Klassen und Methoden deklariert sein müssen bevor man sie benutzt. Und *nur* deklariert. In der Praxis ist das so ähnlich gemacht, nur halt nicht von Hand. Man macht es nicht, aber es wäre möglich.

    In C++ ist das nicht möglich. Den Templates müssen vollständig bekannt sein.



  • sinnmacher schrieb:

    In C++ ist das nicht möglich. Den Templates müssen vollständig bekannt sein.

    Templates arbeiten aber auch gänzlich anders als Generics (und erlauben auch weit mehr). Zudem sind mit Sicherheit nicht alle C++ Dateien mit Templates voll gestopft (Ich kenne viele C++ Projekte die als Templates maximal die STL verwenden, und nicht ein Template selbst geschrieben haben).



  • sinnmacher schrieb:

    In C# könnte man problemlos einführen, dass alle Klassen und Methoden deklariert sein müssen bevor man sie benutzt.

    Jop und in C++ ist es bereits so...

    sinnmacher schrieb:

    Und *nur* deklariert.

    Genau so funktioniert das in C++ im Allgemeinen...

    sinnmacher schrieb:

    In C++ ist das nicht möglich. Den Templates müssen vollständig bekannt sein.

    Ja, für viele Dinge muss unter gewissen Umständen die vollständige Definition bekannt sein. Mir ist aber nicht klar, wieso genau das in C#, wo das im Moment fundamental anders funktioniert, nun mehr Sinn machen sollte als in C++, wo das im Moment genau so funktioniert... 😕


Anmelden zum Antworten