myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Grundlagen von C# » Operator checked / checked Anweisungsblock
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Operator checked / checked Anweisungsblock

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
RafaelVogt RafaelVogt ist männlich
myCSharp.de-Mitglied

Dabei seit: 15.08.2019
Beiträge: 27


RafaelVogt ist offline

Operator checked / checked Anweisungsblock

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo zusammen, dies ist die 2te Frage im Zusammenhang mit meinem Wunsch C# von grundauf zu lernen. Mittlerweile bin ich am Ende des Kapitels "Variablen und Datentypen" angekommen. Hier geht es um den Operator >>checked<<. Ich weiß, das er einen Laufzeitabbruch verursacht und vor einem "Überlauf" schützt. Hier mein bisheriges Wissen:

C#-Code:
namespace _04_elementare_Datentypen
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Die Operatoren >>checked<< und >>unchecked<<:");

            Console.WriteLine("Geben Sie eine Zahl im Bereich von ");
            Console.WriteLine($"0...{Int16.MaxValue} ein:");

            short value20 = Convert.ToInt16(Console.ReadLine());

            byte value21 = checked((byte)value20);

            Console.WriteLine(value21);

            Console.ReadKey();
        }
    }
}

Bis hier her komme ich mit. Gibt man z.B. einn Wert 256 ein, würde das zu einem Überlauf führen und der >>checked<< Operator bricht die Laufzeit ab. Nun steht in dem Buch einfach folgender Satz.

Zitat:
"Falls nich nur ein einzelner Ausdruck, sondern mehrere Ausdrücke innerhalb eines Anweisungsblocks auf einen möglichen Überlauf hin kontrolliert werden, können sie hinter >>checked<< einen Anweisungsblock angeben. Folgendes Beispiel dazu wird dann im Buch geliefert.

C#-Code:
namespace _04_elementare_Datentypen_8
{
    class Program
    {
        static void Main(string[] args)
        {
            checked
            {
                short shortValue = 436;
                int integerValue = 1236555;
                byte byteValue = (byte)shtVar;
                shortValue = (short)integerValue;
                Console.WriteLine(byteValue);
                Console.ReadLine();
            }
        }
    }
}

Erstens verstehe ich nicht wie ich diesen Anweisungsblock in zum Beispiel den obigen Code einfügen soll, und zweitens ist die Variable

C#-Code:
shtVar

gar nicht definiert. Was also versucht man mir hier zu sagen?

Vielen Dank im Voraus.
06.09.2019 10:31 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
OlafSt OlafSt ist männlich
myCSharp.de-Mitglied

Dabei seit: 02.05.2011
Beiträge: 63
Entwicklungsumgebung: VS 2015 Community
Herkunft: HH


OlafSt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Das ist doch total simpel großes Grinsen

Dein Code müsste, würde er den checked-operator konsequent nutzen, so aussehen:

C#-Code:
short value20 = checked(Convert.ToInt16(Console.ReadLine()));
byte value21 = checked((byte)value20);

Wenn das jetzt nicht nur 2 Zeilen sind, sondern 132 Zeilen mit solchem Code, wird es echt mühsam, immer wieder checked() einzutippen. Also machen wir n Block draus:

C#-Code:
checked
{
     short value20 = Convert.ToInt16(Console.ReadLine());
     byte value21 = (byte)value20;
}

Alle checked-operatoren sind nun weg, nur der eine um den Block herum ist noch da. Aber der umfasst eben ALLE Zeilen im Block. That simple großes Grinsen

Die fehlende Variable im Buch ist ein Fehler des Lektorats. Lektoren können toll Rechtschreibung und Grammatik, aber nicht programmieren. Die wissen nicht, das shtVar auch mit shortValue ersetzt werden muss, wie es der Autor vorher getan hat Augenzwinkern

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von OlafSt am 06.09.2019 10:39.

06.09.2019 10:38 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
gfoidl gfoidl ist männlich
myCSharp.de-Team

avatar-2894.jpg


Dabei seit: 07.06.2009
Beiträge: 6.594
Entwicklungsumgebung: VS 2019
Herkunft: Waidring


gfoidl ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo RafaelVogt,

anstatt der checked Blöcke kann das auch "global" eingestellt werden.
Projekteigenschaften -> Build -> Advanced -> Checkbox "Check for arithmetic overflow/underflow"
Wobei ich jedoch die expliziten checked Blöcke und Anweisungen bevorzugen, da es eben sofort ersichtlich ist worum es geht.

Siehe zum Thema auch  CA2233: Operations should not overflow

Da du gerade beim Lernen bist, noch ein Hinweis:

Zitat:
C#-Code:
short value20 = Convert.ToInt16(Console.ReadLine());

erzeugt einen Laufzeitfehler, falls Console.ReadLine keine Zahl (in Text-Form) liefert. Wenn du z.B. "abc" eingegeben hast anstatt einer erwarteten Zahl, so stürzt das Programm ab.
Abhilfe schafft entweder den Fehler mittels try catch zu fangen und behandeln od. noch besser

C#-Code:
if (short.TryParse(Console.ReadLine(), out short value20))
{
    // Zahl konnte erfolgreich geparst werden
}
else
{
    // Zahl konnte nicht geparst werden
}

zu verwenden. Ob und wie auf das "nicht parsen" reagiert wird, hängt von der Anwendung ab.

mfG Gü
06.09.2019 10:58 Beiträge des Benutzers | zu Buddylist hinzufügen
RafaelVogt RafaelVogt ist männlich
myCSharp.de-Mitglied

Dabei seit: 15.08.2019
Beiträge: 27

Themenstarter Thema begonnen von RafaelVogt

RafaelVogt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von OlafSt:
Dein Code müsste, würde er den checked-operator konsequent nutzen, so aussehen:

C#-Code:
short value20 = checked(Convert.ToInt16(Console.ReadLine()));
byte value21 = checked((byte)value20);

Mit ...

C#-Code:
short value20 = checked(Convert.ToInt16(Console.ReadLine()));

... machst du genau was?

Sorry... es ist echt verwirrend.
06.09.2019 11:05 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
RafaelVogt RafaelVogt ist männlich
myCSharp.de-Mitglied

Dabei seit: 15.08.2019
Beiträge: 27

Themenstarter Thema begonnen von RafaelVogt

RafaelVogt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ach um gleich zu checken ob der eingegebene Wert nicht den short überläuft?
06.09.2019 11:08 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
gfoidl gfoidl ist männlich
myCSharp.de-Team

avatar-2894.jpg


Dabei seit: 07.06.2009
Beiträge: 6.594
Entwicklungsumgebung: VS 2019
Herkunft: Waidring


gfoidl ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo RafaelVogt,

Zitat von RafaelVogt:
Zitat von OlafSt:
Das ist doch total simpel :D
Mit ...

C#-Code:
short value20 = checked(Convert.ToInt16(Console.ReadLine()));

... machst du genau was?

Sorry... es ist echt verwirrend.

Hier macht das checked nicht viel Sinn, da Int16 der Typ des Schlüsselworts short ist. Da kannst du es weglassen.

Anders wäre es z.B. bei

C#-Code:
short s0 = checked(Convert.ToUInt16(Console.ReadLine()));

da bei der Konvertierung* ein ushort zurückgegeben wird, das könnte bei der Zuweisung zu short überlaufen.
Od. beim Beispiel von oben mit der Zuweisung zu byte.

Generell ist auf (arithmetischem) Über-/Unterlauf zu achten, wenn verschiedene  Wertebereiche im Spiel sind. Entweder wird explizit im Code geprüft ob es passt (z.B. per if) od. mit checked od. gar nicht, falls Überlauf akzeptabel ist.

* bitte unbedingt meinen obigen Hinweis zu den TryParse-Methoden beachten.

mfG Gü
06.09.2019 16:11 Beiträge des Benutzers | zu Buddylist hinzufügen
RafaelVogt RafaelVogt ist männlich
myCSharp.de-Mitglied

Dabei seit: 15.08.2019
Beiträge: 27

Themenstarter Thema begonnen von RafaelVogt

RafaelVogt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Vielen, vielen Dank.
06.09.2019 18:52 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als ein Monat.
Der letzte Beitrag ist älter als ein Monat.
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 19.10.2019 11:55