Hallo zusammen,
ich hoffe ich habe bei der Suche nichts übersehen, deshalb hier meine Frage:
Ich benutze das untenstehende Codefragment um bestimmte Dateiendungen von einer Operation auszuschließen. Komischerweise interessiert das switch-case die Dateiendung gar nicht! Beim debuggen springt der Aufrufzeiger immer direkt ins default. Hab ich irgendwas übersehen?
FileInfo fi = new FileInfo(_attachmentName);
var test = fi.Extension;
switch (test)
{
case ".7z":
case ".zip":
case ".rar":
case ".gzip":
break;
default:
CompressAttachment(_compressName, _attachmentName);
break;
}
Grüße,
Michael
Grüße,
der Michael
Hallo Lumbra,
Groß-/Kleinschreibung ggf?
spooky
Wenn du im default landest, wie ist denn dann der Wert von deiner var test?
Again what learned...
Ich hab es mit test.7z und test.zip probiert.
fi.Extension macht daraus ".7z" und ".zip", was meinen Cases entspricht.
Ich hab auch noch extra in der MSDN geschaut aber da steht es mit den Strings genauso (switch-case)
Grüße,
der Michael
Nee, definitiv nicht, aber selbst wenn, der ReSharper hätte mich drauf hingewiesen denke ich...
Wenn ich das ganze als IF-Anweisung umbau, dann gehts übrigens auch nicht!
Da fällt mir was ein: fi.Extension gibt einen Unicode-String zurück - was ist denn "string" selbst?
Grüße,
der Michael
Der Code aus dem Startpost funktioniert ohne Probleme.
Wenn du ToLower() schon versucht hast, warum hast du diese (wohl zum funktionieren essentielle Zeile) wieder gelöscht?
@Spook: Wenn es damit funktionieren würde, hätte ich hier kaum gefragt 😉
Grüße,
der Michael
Hi Lumbra
Versteh' mich nicht falsch aber ich würde sagen da passt irgendwas anderes nicht.
Führ' das hier mal aus:
[Test]
public void SampleUsage() {
string[] extensions = new[] { ".zip", ".7z", ".rar", "blubber", "blubb" };
foreach (var test in extensions) {
switch (test) {
case ".7z":
case ".zip":
case ".rar":
case ".gzip":
break;
default:
Debug.WriteLine(test);
break;
}
}
}
Grüße
Flo
Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+
Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.
Hallo Lumbra,
der einzige Fehler ist dass du höchstwahrscheinlich im Release Mode bist und "Optimize Code" eingestellt hast. Oder du hast dies im Debug Mode explizit gesetzt.
Dabei wird deine switch oder if wegoptimiert, da sie einfach keinen Sinn macht. Um der Optimierung temporär zu umgehen schreib mal folgendes, dann siehst du super dass der Code richtig funktioniert und er in den richtigen switch/if Fall reingeht:
switch (test)
{
case ".gzip":
case ".rar":
case ".zip":
case ".7z":
Debugger.Break();
break;
default:
Debugger.Break();
break;
}
So wird der case Block auch im "Optimize Code" ausgeführt.
@Florian Reischl,
deins funktioniert mit der "Optimize Code" an auch nicht, anderfalls schon.
@Lumbra
Naja, es würde funktionieren, aber der Code macht NIX, desswegen wird er wegoptimiert. Wenn du in den Statements etwas Code rein machst wird auch nichts wegoptimiert. 😁
Kick die Option aber nicht im RELEASE mode weg, sondern nur wenn sie im DEBUG aktiviert ist.
Gruß
Michael
Hmm, die Einstellungen haben nichts gebracht...
Aber ich habe jetzt statt break; return; eingefügt und seltsamerweise gehts nun...
Danke Euch für die Anregungen!!
Grüße,
Michael
Grüße,
der Michael
Ja aber return und break zwei verschiendene Arten eine switch zu beenden. Währen das eine aus der Methode zurückkehrt, bricht die eine nur die switch ab.
Desswegen die Frage, was willst du mit dem Code erreichen. Auf jeden Fall macht er NIX.
Das beschriebene Problem ist doch, dass er immer in den default block springt und nicht, dass er den switch block optimiert.
@xxMUROxx: Das sehe ich aber anders, mein Code macht durchaus etwas, allerdings nur im DEFAULT...
Mit den Cases vorher wollte ich eigentlich "nur" einen Abbruch des Switchs erreichen
Bei mir sieht es jetzt so aus:
FileInfo fi = new FileInfo(_attachmentName);
var test = fi.Extension.ToLower();
switch (test)
{
case ".7z":
case ".zip":
case ".rar":
case ".gzip":
return;
default:
attachment.SaveAsFile(_attachmentName);
CompressAttachment(_compressName, _attachmentName);
_attachmentIndex = attachment.Index;
_mailItem.Attachments.Remove(_attachmentIndex);
_mailItem.Attachments.Add(_compressName, Type.Missing, Type.Missing, Type.Missing);
return;
}
Gruß,
Michael
Grüße,
der Michael
Hallo Lumbra,
das was du da machen willst ist nicht wirklich für ein switch geeignet.
Es wird zwar funktionieren ist aber nicht wirklich sinnvoll.
Du kannst das auch einfach mit einer if Anweisung machen.
So z.B.
var extensions = new string[]{".txt", ".png", ".jpg"};
if(!extensions.Contains(fi.Extension.ToLower()))
{
//das wäre dann das selbe wie dein Default im Switch
}
Gruß
Michael
Hallo michlG,
so in der Art hab ich es jetzt gemacht, wobei Contains() bei strings nicht funktioniert - also habe ich eine List<string> genommen, damit gehts dann wieder...
Danke Euch für Eure Hilfe!!
Gruß,
Michael
Grüße,
der Michael
wobei Contains() bei strings nicht funktioniert
Wieso sollte das nicht funktionieren? Es ist zwar wesentlich langsamer aber das hier müsste m.E. nach gehen.
string extensions = ".txt.png.jpg";
if(!extensions.Contains(fi.Extension.ToLower()))
{
//das wäre dann das selbe wie dein Default im Switch
}
Again what learned...
rollerfreak2, wobei zu erwähnen ist, dass Dein Beispiel nicht "korrekt" ist. Es hätte unangenehme Nebeneffekte. Daher sollte hier auf eine Liste zurück gegriffen werden.
Siehe Beispiel von michlG.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Abgesehen von anderen, besser funktionierenden, Lösungen stellt sich natürlich immer noch die Frage, warum switch/case nicht funktionieren sollte.
Leider ist Lumbra bisher die Antwort auf die Frage nach dem Inhalt von Extension im default-Zweig schuldig geblieben. Außerdem könnte durch Logging festgestellt werden, ob es einfach nur ein scheinbares Fehlverhalten z. B. aufgrund von Optimierungen war.