Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Sylence

Community-Fossil

  • »Sylence« ist der Autor dieses Themas

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

1

26.04.2012, 16:25

[C#] Variable angeblich nicht initialisiert

Ich bin grade über etwas gestolpert, dass ich nicht so ganz nachvollziehen kann. Folgender Code:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool test;
try
{
    test = true;
}
catch
{
    test = false;
}
finally
{
    if( test ) // error CS0165: Use of unassigned local variable 'test'
    {
    }
}


Wie kann test denn in dem finally Block nicht initialisiert sein?
Mir ist klar, dass ich test einfach bei deklaration initialisieren kann, aber mir gehts eher darum, warum der Compiler denkt (oder weiß?), dass es szenarien geben könnte, in denen test im finally block nicht initialisert wurde?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

26.04.2012, 16:33

Gute Frage. Er muss wohl davon ausgehen, dass der catch-Block eine Exception werfen könnte bevor die Zuweisung ausgeführt werden konnte. Oder er ist einfach so blöd und geht davon aus, dass wenn eine Variable nicht vor dem try-Block initialisiert wurde, sie es bis zum finally-Block eventuell ebenfalls nicht ist. Relativ unlogisch, aber Compiler müssen ja nicht unbedingt logisch denken können ;)
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

3

26.04.2012, 21:31

Das ist für den Compiler das selbe wie bei if-Blöcken. Bei switch-case müsste das Problem auch auftreten. So weit denkt der Compiler da halt nicht. An sich sollte man Variablen ja eh möglichst direkt initialisieren.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

26.04.2012, 21:39

Bei IF-Blöcken, wo in beiden Zweigen eine Zuweisung erfolgt, erkennt das sowohl C#, als auch Java. Bei Switch bin ich mir nicht sicher.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Sylence

Community-Fossil

  • »Sylence« ist der Autor dieses Themas

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

5

26.04.2012, 21:46

Jap. Bei if+else und bei nem switch mit default meckert der compiler nicht. Das ist ja grad der Grund warum ich das nicht nachvollziehen konnte. Weil ich das so eben kenne, dass er doch intelligent genug ist, um das zu merken.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

6

26.04.2012, 21:49

Bei Java musst du catch aber sagen um welche Exceptions es geht. Wobei sowas:

C#-Quelltext

1
boolean test;try {    test = true;    throw new Exception();}catch (Exception e) {}if(test) {}


auch nicht kompiliert werden darf. Sobald im catch-Block eine Definition für test ist, ist es jedoch valide. Also nicht ganz wie bei C#.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

26.04.2012, 22:02

1) Dein Java-Example hat keinen finally-Block. Der ist wichtig für das Beispiel.
2) Dürfte es mit finally auch nicht ohne Warning gehen, denn ein "catch (Exception)" fängt kein Throwable, womit dann "test" im finally-Block in der Tat nicht initialisiert sein könnte. Wobei es in diesem Fall da natürlich wirklich keinen anderen Weg gibt, außer bei einem Fehler der VM-Ausführung ;)
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

8

26.04.2012, 22:46

Also, ich meine 100% perfekt ist der C# Compiler in dem Punkt nicht. Immerhin scheint es nicht zu passieren, dass eine Variable uninitialisiert benutzt werden kann. Aber ich hatte schon öfter das Gefühl, dass man eine eigentlich immer schon belegte Variable doch lieber bei der Deklaration mit einem Wert belegt.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

26.04.2012, 23:21

Auch wenn es in dem trivialen Beispiel eindeutig ist, so kann der Compiler im Allgemeinen nicht davon ausgehen, dass nicht vor der jeweiligen Initialisierung eine Exception fliegt. Daher wird er den Code wohl gar nicht erst dahingehend analysieren...

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

10

26.04.2012, 23:30

Welche dann aber durch den catch-Block abgefangen würde. So habe ich eben auch gedacht aber an sich wird alles gefangen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige