Autor Beitrag
Dingo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64
Erhaltene Danke: 1



BeitragVerfasst: Mi 26.04.17 13:25 
Grüße!

Habe meine Prüfungsarbeit zurück bekommen und wurde etwas als falsch markiert und wollte euch mal Fragen, was falsch sein soll. Finde da keine Fehler und der Tutor meldet sich ziemlich selten. Darum mal die Frage an euch, ob ihr mal schauen könnt und ich nicht falsch weiter lerne.^^


1. Aufgabe - Vordefinierte Typen aufzeigen, Erklären und sinnvoll ordnen:

Vordefinierte Typen werden immer durch ein klein geschriebenes Schlüsselwort repräsentiert, wie zum Beispiel „string“, „int“ oder „object“. Vordefinierte Typen haben immer einen Alias zu einem echten .NET-Typen.

Übersicht der vordefinierten Typen:

Wertetypen
Numerische
Ganzzahlen mit Vorzeichen (sbyte, short, int, long)
Ganzzahlen ohne Vorzeichen (byte, ushort, uint, ulong)
Gleitkommazahlen (float, double, decimal)
Boolesche (bool)
Char (char)

Referenztypen
String (string)
Object (object)

Übersicht über eine kleine Auswahl vordefinierter Typen mit ihrem Alias:

Vordefinierter Typ - Alias
System.String - string
System.Object - object
System.Int32 - int
System.Int64 - long


Nicht alle Schlüsselwörter die mit Typen zu tun haben gehören zu den vordefinierten Typen. Es gibt noch eine zweite Gruppe, die Gruppe der benutzerdefinierbaren Typen.

Zu ihnen Zählen:

class, interface, array, delagates, struct, enum

Diese Schlüsselwörter dienen der Typendeklaration, Beispiel:

Schlüsselwort - Deklaration
class - Klasse
interface - Interface
struct - Struktur
enum - Enumeration

Antwort: Das sind doch keine konkreten Typen.


2. Aufgabe, Typen erklären:

Ganzzahlen Zahlen

Ganzzahlentypen gibt es sowohl im positiven, als auch im negativen Wertebereich.


Gleitkommazahlen

Gleitkommazahlen können sowohl positiv, als auch negativ sein und sind immer Vorzeichenbehaftet. Gleitkommazahlen zeichnen sich durch ihre hohe Genauigkeit aus. float ist dabei auf 7 Stellen genau, double auf 15 Stellen und decimal auf 29 Stellen. Vorteil von decimal zu double ist zwar die größere Genauigkeit, hat jedoch einen kleinerer Wertebereich als double.

Gleitkommazahlen lassen sich dabei auf verschiedene Arten darstellen. So kann man zum Beispiel die Zahl 123456789 auch Wissenschaftlich mit einem Exponenzialkoeffizienten darstellen.

Alle Wertetypen sind von Value.Type abgeleitet und kennen mit Ausnahme von Boolean die Datenelemente MinValue, Max Value, NegativeInfinity, PositivInfinity, NAN, sowohl Epsilon.

Übersicht:

NegativInfinity (Negativ Unendlich)
|
MinValue (Größter negativer Wert)
|
NegativerWertebereich
|
NAN (Bereich zwichen der kleinsten negativen Zahl und 0, der nicht |
| abgedeckt ist (NAN = Not a Number))
|
0
|
NAN (Bereich zwischen der kleinsten positiven Zahl und 0, der nicht
| abgedeckt ist)
|
Epsilon (Kleinste positive Zahl)
|
Positiver Wertebereich
|
MaxValue(Größter positiver Wert)
|
PositivInfinity (Positiv Unendlich)


Boolescher Typ

Der Boolesche Typ ist ein logischer Typ, der nur zwei Zustände annehmen kann bzw. kennt. Richtig (true) oder Falsch (false).


Char Typ:

Der Char Typ ist ein sehr spezieller Typ. Jedes Zeichen welches man benutzen kann ist einer speziellen Nummer zugeordnet welches sich im Unicode befindet. Der Zeichensatz des Unicode ist 65.536 Zeichen groß und basiert auf dem ASCII-Zeichensatz mit 128 Zeichen bzw. dem ANSI Zeichensatz mit 256 Zeichen. Im Jahre 2001 wurde der nicht mehr ausreichende Char Zeichensatz von 2 Byte auf 4 Byte erhöht, wodurch nun eine Zeichenmenge von ca. 4,3 Milliarden Zeichen möglich ist. Die ersten 128 Zeichen des Unicode Zeichensatzes entsprechen dabei den Zeichen des ASCII-Zeichensatz.


String Typ:

Strings sind Zeichenketten und werden immer in doppelten Anführungszeichen geschrieben. Sie gehören zu den Referenz- bzw. Verweistypen. Strings sind eine Besonderheit bei den Referenz- bzw. Verweistypen. Einmal einen Wert zugewiesen, können Strings nicht mehr verändert werden.

Beispiel:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
string text1, text2;

text1 = „Einen Guten Tag!“
text2 = text1;
text1 = „Einen Guten Abend!“

Console.WriteLine(text1);
Console.WriteLine(text2);

// Ausgabe: Einen Guten Abend!
// Ausgabe: Einen Guten Tag!

Wie man am Beispiel sieht, Strings können nach ihrer initialisierung nicht mehr verändert werden, sie werden bei jeder Änderung neu erstellt. Sie handeln also untypisch für Referenz- bzw. Verweistypen.


Object Typ

object ist der vordefinierte Alias von System.Object und hat damit die selbe Stellung. object ist der Basis-Typ aller Wertetypen. Demnach kann object auch alle Werte, sämtlicher Typen annehmen.

Beispiel
ausblenden C#-Quelltext
1:
2:
3:
object objekt1 = „Guten Tag!“;
object objekt2 = 13;
object objekt3 = new Luftfahrzeug("LH 200");

Ruft man die Methode Get.Object auf erhällt man folgendes:
ausblenden C#-Quelltext
1:
2:
3:
System.String;
System.Int32;
Lektion.1Luftfahrzeuge;

Wenn eine Variable eines Types in ein Object konvertiert wird, nennt man dies Boxing. Der Wert wird geschachtelt und im Heap Bereich gespeichert, dieser Vorgang ist impliziet. Ein direkter Zugriff auf die Variable ist nicht mehr möglich, sie wurde zu einem Objekt von System.Object. Der geschachtelte Wert muss wieder zum vorschein gebracht werden, will man ihn verwenden. Dieser Vorgang ist expliziet und wird Unboxing genannt. Der Wert wird wieder im Stack gespeichert.

Beispiel:
ausblenden C#-Quelltext
1:
2:
3:
4:
int i = 44;
object o = i; // Der Wert i wird per Boxing zu einem Object

i = (int)o;  // Unboxing per Typ-Konvertierung, der Wert kommt wieder zurück in eine Variable

Antwort: Ihre Lösung enthält die Informationen, die hier gefragt wurden, aber auch eine Menge Infos, die für die Aufgabe nicht relevant und zudem noch falsch sind. Punkte: 25/30

Moderiert von user profile iconTh69: Titel geändert (war nur "Fehler finden").
Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Blup
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 173
Erhaltene Danke: 43



BeitragVerfasst: Mi 26.04.17 14:49 
Man kann viele richtige Dinge aufzählen und doch das Thema verfehlen.
Du lässt dich z.B. über Schlüsselwörter aus, danach wurde aber nicht gefragt.
Wie lautet den die vollständige Aufgabenbeschreibung, die eine Zeile je Aufgabe ist nicht wirklich eindeutig.
Dingo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64
Erhaltene Danke: 1



BeitragVerfasst: Mi 26.04.17 15:12 
1. und 2. gehören zu einer Aufgabe, die hieß:

Erklären Sie: Was sind "vordefinierte" Typen? Stellen Sie alle vordefinierten Typen zusammen, gruppieren Sie diese Typenzusammenstellung nach sinnvollen Kriterien und geben Sie zu jedem Typ eine kurze Charakterstatistik.
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 26.04.17 15:52 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Dingo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64
Erhaltene Danke: 1



BeitragVerfasst: Mi 26.04.17 16:56 
Zitat:
Ganze Zahlen in einen Satz erklärt, ist etwas dürftig.

Mhhh naja, viel mehr steht in meinem "Fachheft" zu Ganzzahlentypen nicht drin. :oops:

Zitat:
Zur 1.Frage ist 2/3 des Textes O.K, und der letzte Abschnitt beginnend mit "Nicht alle Schlüsselwörter ..." ist verfehlt.

Verfehlt, aber fachlich falsch ist es nun nicht, oder?

Zitat:
Gleitkommazahlen: "Gleitkommazahlen zeichnen sich durch ihre hohe Genauigkeit". Eben nicht! Deswegen wird auch nicht aufs Komma genau oder auf Null(0) geprüft.


OK, hab ich falsch geschrieben, meinte eigentlich das: Das Wesen von Gleitkommazahlen liegt in ihrer kompakten Darstellbarkeit.

I.O. mein Fehler.

Zitat:
"float ist dabei auf 7 Stellen genau, double auf 15 Stellen und decimal auf 29 Stellen". Ja und Nein. Es kommt drauf an, wieviele dieser Stellen vor dem Komma sich befinden. Der Rest davon deckt die Genauigkeit der Nachkommastellen.


Muss ich noch mal in anderen Büchern nachlesen, steht in meinem Heft genau so drin.

Zitat:
Char Typ


War mir fast klar, dass ich hier Fehler hab, der Text aus dem Heft war nen ziemliches Kuddelmuddel und schwer verständlich.


Zitat:
String Typ: "Einmal einen Wert zugewiesen, können Strings nicht mehr verändert werden." Bist du dir da sicher?

Steht genau so in meinem Heft. Einmal zugewiesen, lässt sich der String nicht mehr ändern. Es kann nur ein neuer String erzeugt werden.

Zitat:
Object Typ: Boxing ist mir kein Begriff, aber das Konvertieren kann auch mit Convert.ToSomething() durchgeführt werden. Zu gestern: Welcher Unterschied besteht zwischen:

ausblenden C#-Quelltext
1:
2:
3:
4:
object o = i;
i = (int)o;
// und ...
i = o as int;


So wie ich es verstanden habe ist der Unterschied das bei as das Objekt nicht geschachtelt wird. Kann ich noch nicht genau sagen, da Typenumwandlung bisher nur hier und da mal angerissen wurde.
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 26.04.17 17:20 
Zitat:
"float ist dabei auf 7 Stellen genau, double auf 15 Stellen und decimal auf 29 Stellen". Ja und Nein. Es kommt drauf an, wieviele dieser Stellen vor dem Komma sich befinden. Der Rest davon deckt die Genauigkeit der Nachkommastellen.

:?: Verwirrende Aussage. Wo das Komma relativ zu den Stellen ist ist völlig egal. Das Komma kann vor den genauen Stellen sein, dahinter oder irgendwo dazwischen. Es macht für die Aussage wieviele Stellen genau sind keinen Unterschied. Insofern halte ich den Satz für richtig auch wenn mehr Details möglich wären.

Zitat:
Steht genau so in meinem Heft. Einmal zugewiesen, lässt sich der String nicht mehr ändern. Es kann nur ein neuer String erzeugt werden.

strings sind unveränderlich (immutable). Deine Aussage ist richtig. Natürlich kann die gleiche string Variable auf einen anderen string zeigen aber ein string object ist unveränderlich. Verändern eines strings heißt immer einen neuen string (mit den entsprechenden Änderungen) zu erzeugen.

Zitat:
Verfehlt, aber fachlich falsch ist es nun nicht, oder?


Doch der Abschnitt ist falsch. Du beschreibst Schlüsselwörter die zum Definieren von Typen benutzt werden sie sind aber selbst keine Typen. Diese Schlüsselwörter werden zum definieren von Typen verwendet. Unabhängig davon ob benutzerdefiniert oder intern. Im Sourcecode des Frameworks steckt irgendwo zum Beispiel ein public struct Int32 : IComparable, IFormattable, IConvertible, IComparable<Int32>, IEquatable<Int32> zur Definition von int. Auch ein int ist ein struct. Zu behaupten int ist ein interner Typ und struct benutzerdefiniert offensichtlich falsch.

Zitat:
So wie ich es verstanden habe ist der Unterschied das bei as das Objekt nicht geschachtelt wird. Kann ich noch nicht genau sagen, da Typenumwandlung bisher nur hier und da mal angerissen wurde


Lass dich nicht verwirren. Der as Operator wird so wie gezeigt nicht funktionieren. Der geht nur bei Referenztyp (wie sollte as auch bei einem Typkonflikt. o enthält keinen int) eine null draus machen? Das Ziel und der Typ wären Wertetypen die null nicht zulassen. Lokale Wertetypen und lokale Referenztypen leben in verschieden Speicherbereichen und wenn ich bei einem Wertetyp so tu als wäre er ein Referenztyp (eine object Variable wäre ein Referenz und wird damit behandelt wie ein Referenztyp) dann muß er im Speicher verschoben werden und wird dabei gekaspelt (geboxt). Das ist aber ein technischen Implementierungsdetail das einem eigentlich fast immer egal sein kann. Außer man kommt in Performanceprobleme weil man Code produziert hat der viel (un)boxing erzeugt. Unboxing ist wegen der Speicheraktion natürlich relativ teuer.
Dingo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64
Erhaltene Danke: 1



BeitragVerfasst: Mi 26.04.17 17:39 
Zitat:
Doch der Abschnitt ist falsch. Du beschreibst Schlüsselwörter die zum Definieren von Typen benutzt werden sie sind aber selbst keine Typen. Diese Schlüsselwörter werden zum definieren von Typen verwendet. Unabhängig davon ob benutzerdefiniert oder intern. Im Sourcecode des Frameworks steckt irgendwo zum Beispiel ein public struct Int32 : IComparable, IFormattable, IConvertible, IComparable<Int32>, IEquatable<Int32> zur Definition von int. Auch ein int ist ein struct. Zu behaupten int ist ein interner Typ und struct benutzerdefiniert offensichtlich falsch.


Das versteh ich jetzt nicht, hab das aus nem anderen Buch, dass dies "benutzerdefinierbare Typen sind. Selbst mit Grafik, siehe Anhang. In meinem Heft steht auch es wären Typen. Verstehe ich gerade nicht.
Einloggen, um Attachments anzusehen!
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 26.04.17 18:08 
- Nachträglich durch die Entwickler-Ecke gelöscht -
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 26.04.17 18:40 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Die Aussage ist nicht verwirrend und es ist nunmal nicht egal, wo das Komma steht:
ausblenden C#-Quelltext
1:
2:
float f1 = 1.234567898765f;  // Ausgabe: 1,234568
float f2 = 1234567.898765f;  // Ausgabe: 1234568 ... Komma weg o.o


Verstehe ich nicht. Du zeigst doch schön das die ersten sieben Stellen immer noch genau und gleich sind, bei beiden floats unabhängig vom Komma. Ein Komma ist in einem float keine Stelle. Ein Komma ist möglichwerweise ein Produkt einer float -> string Umwandlung in einer bestimmten Darstellungsform. In solch einem String kannst du gerne das Komma für eine Stelle (aka Zeichen) halten das ist dem float aber egal. Hättest du zum Beispiel die Exponentialschreibweise bei der Umwandlung gewählt würdest du erst gar kein Komma sehen. Möglicherweise sind in bestimmten Kulturen sogar 2 Zeichen für das Komma nötig, wer weiß. Einen Werte sollte man möglichst von seiner textuellen Darstellung unterscheiden auch wenn uns das allen schwer fällt. In der üblichen Literatur ist bei der Stellengenauigkeit nie das Komma als Stelle mitgezählt.
Dingo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64
Erhaltene Danke: 1



BeitragVerfasst: Mi 26.04.17 18:43 
Ihr verwirrt mich gerade etwas, was ist nun richtig?^^
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 26.04.17 18:48 
- Nachträglich durch die Entwickler-Ecke gelöscht -
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 26.04.17 20:05 
Zitat:
Ihr verwirrt mich gerade etwas, was ist nun richtig?^^

Zitat:
float ist dabei auf 7 Stellen genau, double auf 15 Stellen und decimal auf 29 Stellen


Dieser Satz ist richtig ;) Denn wirst du ja auch so oder ähnlich in der Literatur finden.

Zitat:
Das versteh ich jetzt nicht, hab das aus nem anderen Buch, dass dies "benutzerdefinierbare Typen sind. Selbst mit Grafik, siehe Anhang. In meinem Heft steht auch es wären Typen. Verstehe ich gerade nicht.


Zitat:
class MeineLiebeKlasse
{
}


MeineLiebeKlasse ist der Bezeichner für einen (meinen) benutzerdefinierbaren Typen. class ist nur das Schlüsselwort um zu sagen was für eine Typdefinition jetzt folgt. Das Schlüsselwort class allein ist aber kein benutzerdefinierter Typ es ist nicht mal ein Typ.
Oder um es anders zu sagen MeinLiebeKlasse ist eine Klasse. class ist keine Klasse es ist ein Schlüsselwort zum definieren einer Klasse. Jetzt klarer? Du hast es so beschrieben als wären die Schlüsselwörter selbst benutzerdefinierte Typen im Gegensatz zu vordefinierten Typen. Das Schlüsselwort ist aber nur ein Hilfsmittel zum definieren eines Typen. Und dann auch noch egal ob vordefiniert oder benutzerdefiniert. Bei beiden Definitionen (auch wenn du die der vordefinierten nicht so einfach siehst) werden diese Schlüsselwörter verwendet.

Übrigens das Buch aus dem das Bild stammt ist vermutlich besser als das wo du den Begriff "vordefinierte Typen" her hast ;) Im Framework befinden sich tausende vordefinierte Typen. Die Klasse Console die du beispielhaft verwendest ist ja auch vordefiniert aber trotzdem keine Klasse die hier mit vordefinierte Typen gemeint ist. Der Begriff einfache Typen wie im Bild oder Basisdatentyp ist da deutlich passender. Es geht sich um Typen die so elementar sind das der Compiler eine besondere Behandlung für die hat damit tatsächlich schneller Code rauskommt und natürlich letztlich alle anderen Typen in ihren internas auf diese Basisdatentypen zurückfallen. Das vordefiniert sein ist nur zwangsweise nötig damit der Compiler die besonders behandeln kann. Das vordefiniert sein ist aber keine exclusive Eigenschaft dieser Typen.
Dingo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64
Erhaltene Danke: 1



BeitragVerfasst: Mi 26.04.17 20:53 
Verstehe, also wäre nun beim Beispiel:
ausblenden C#-Quelltext
1:
class MeineKlasse{}					

class das Schlüsselwort, damit der Compiler weiss, dass es eine Klassr ist und MeineKlasse wäre der selbstdefinierte Typ?

Das Buch wo das Bild drin war, war leider eine Online Version, finde sie nur leider nicht mehr. Kennst du es?

Zitat:
Übrigens das Buch aus dem das Bild stammt ist vermutlich besser als das wo du den Begriff "vordefinierte Typen" her hast ;)

Naja, ich nutze ja nicht irgend ein Buch, es ist mein Studienheft, scheint aber in einigen Fällen Fehler zu haben bzw. ungenügend zu beschreiben.

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
hydemarie
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 475
Erhaltene Danke: 51



BeitragVerfasst: Do 27.04.17 14:11 
Ich finde das Stringbeispiel auch falsch gewählt.

user profile iconDingo hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
string text1, text2;

text1 = „Einen Guten Tag!“
text2 = text1;
text1 = „Einen Guten Abend!“

Console.WriteLine(text1);
Console.WriteLine(text2);

// Ausgabe: Einen Guten Abend!
// Ausgabe: Einen Guten Tag!


Wie du siehst, wird text1 hier sehr wohl "verändert" (nur das Objekt dahinter nicht), denn es wird nicht zweimal "Einen Guten Tag!" ausgegeben. Was möchtest du damit illustrieren?
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: Do 27.04.17 15:10 
Die Erklärungen dazu finde ich auch verwirrend. Es zeigt sich aber an dem Beispiel, daß sich die String-Klasse wie ein Wertetyp verhält und nicht wie ein Verweistyp (obwohl es eine Klasse ist). Ich finde den Artikel [FAQ] Besonderheiten der String-Klasse (immutabler Referenztyp mit Wertsemantik) dazu sehr informativ.
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: Do 27.04.17 20:44 
Zitat:
Es zeigt sich aber an dem Beispiel, daß sich die String-Klasse wie ein Wertetyp verhält und nicht wie ein Verweistyp (obwohl es eine Klasse ist).

:?: Egal ob ein string ein Werte- oder Referenztyp wäre die Ausgabe in diesem Beispiel wäre immer gleich. Insofern zeigt dieses Beispiel irgendwas aber sicher nicht ob string ein Wertetyp oder ein Referenztyp oder ein immutable Typ(wenn wir gerade mal so tun als wäre das was 3.tes) ist.

Oder anders gesagt, was bei der Zuweisung text2 = text1; passiert, kopieren oder referenzieren, hat gar keinen Einfluss auf die Ausgabe im Beispiel. Wenn ich text1 was neues zuweise ist das Verhalten immer gleich. Ich müsste das vorhandene ändern um einen Unterschied zu sehen, das geht aber eben bei strings nicht.