Laden...
13 Antworten
39,528 Aufrufe
Letzter Beitrag: vor 16 Jahren
Kein TryParse im .net CF?

Hallo,

ich bin gerade dabei, ein Projekt von einer Desktop-Anwendung (.net Framework 2.0) auf einen Pocket PC (.net compact framework 2.0) zu übertragen.

Nun habe ich jedoch eine "MissingMethodException" erhalten: Die TryParse Methode gibt es scheinbar nicht im .net CF in dem System.Int32 Struct...

Hat jemand einen Vorschlag, wie ich das am Besten hinbekommen könnte, ohne das vorhande Projekt groß ändern zu müssen?

Ich hab schon etwas mit Convert.ToInt rumprobiert, aber das ist nicht dasselbe... Außerdem tritt dasselbe auch bei long auf, nur gibt es keine Convert.ToLong Funktion.

Lieben Gruß
Dennis

Parse() benutzen und Exception fangen.

Alternativ selbst implementieren.

So macht es Mono:

http://www.koders.com/csharp/fid376B75E1122859CA4DBA2071EE31E1B3DF47C1C5.aspx

nur gibt es keine Convert.ToLong Funktion.

  1. methode
  2. Convert.ToInt64(...)

tryparse funktioniert so:


public static bool TryParseInt64(string wert, out long variable)
{
try
{
variable = Convert.ToInt64(wert);
}
catch{return false;}
return true;
}

Danke euch beiden, hat super geklappt!

Jetzt gehts aber gleich weiter mit der Contains-Methode... 😦

Bin mal gespannt, wo das noch hin führt..

contains ist auch leicht nachzuimplementieren. allgemein ist es leichter eine CF frameworkanwendung nach .net 2.0 zu portieren wie anders herum 😃

tryparse funktioniert so:

  
public static bool TryParseInt64(string wert, out long variable)  
{  
try  
{  
variable = Convert.ToInt64(wert);  
}  
catch{return false;}  
return true;  
}  

Nö, tuts nicht. Stell den Debugger mal auf das Fangen von Ausnahmen der ersten Chance ein und vergleiche das TryParse des Fameworks mit Deiner Varianten. (Abgesehen davon, das sich Deine Variante nicht übersetzen lässt.)

Spätestens wenn man den Quellcode vom Framework durchsteppt wird man sehen das es kein einfaches try catch um ein parse ist.

Ich denke JAck30lena wollte damit auch nur sagen, dass man es so leicht selbst implementieren kann.
Wenn man mal den Reflector anschmeißt sieht man tatsächlich, dass in den TryParse-Methoden kein Try-Catch-Block verwendet wird. Die Aufrufe werden an die statische Methode ParseNumber der internen Klasse Number delegiert. Verstanden hab ich die aber noch nicht, scheint aber mal einen Blick wert zu sein.

mir ist klar, das es nicht exakt so implementiert ist wie ich beschrieb. daher habe cih geschrieben das es so funktioniert und nicht das es so implementiert ist.

Das rausreden anhand von Goldwaage kennen wir in diesem Forum schon. (Das schöne bei mehrdeutigen Aussagen).

mir ist klar, das es nicht exakt so implementiert ist wie ich beschrieb. daher habe cih geschrieben das es so ++funktioniert ++und nicht das es so implementiert ist.

Nein, es funktioniert so nicht.

Als out-Argument übergebene Variablen müssen zwar nicht initialisiert werden, bevor sie übergeben werden, aber die aufrufende Methode muss einen Wert zuweisen, bevor die Methode einen Wert zurückgibt.

MSDN: out (C#-Referenz)

Hallo Knuddlbaer,

Das rausreden anhand von Goldwaage kennen wir in diesem Forum schon.

also mal abgesehen davon, dass ich das aus dem Forum nicht kenne, kannst du im konkreten Fall davon ausgehen, dass JAck30lena genau weiß und wusste, dass bei TryParse intern keine Exception auftritt. Dazu hat er an anderen Stellen schon viel zu oft geschrieben, dass man TryParse statt try { Parse } catch {} verwenden soll, um Exceptions zu vermeiden. Also bitte keine bösen Unterstellungen.

herbivore

Ein Motor funktioniert so, dass er <bla blubb>. Das würden IMHO die meisten so auffassen, das erläutert wird wie ein Motor funktionert. Man erklärt ja nicht, wie er im speziellen zusammengebaut ist sondern erläutert die grundlegende Funktionalität. Das lässt sich IMHO auch auf

tryparse funktioniert so:

public static bool TryParseInt64(string wert, out long variable)  
{  
try  
{  
variable = Convert.ToInt64(wert);  
}  
catch{return false;}  
return true;  

}

übertragen. Das kann man durchaus so verstehen, dass hier behauptet wird, TryParse verwendet einen Try Catch block.

Vielleicht liegt mein Fehler ja daran, das ich nicht weiß was einzelne User hier schreiben oder mir der Postzähler vollkommen egal sind, aber ich finde es Notwendig zu so etwas ergänzend Hinweise zu liefern. Es wird ausreichend Leser geben, die aufgrund des oben zitierten Posts glauben, dass TryParse mittels try catch implementiert sind.

Wer sich so schwammig ausdrückt muss einfach damit Rechnen das es auch ein Kommentar dazu gibt. Wer das nicht will soll ich vorher klar ausdrücken.

kannst du im konkreten Fall davon ausgehen, dass JAck30lena genau weiß und wusste, dass bei TryParse intern keine Exception auftritt. Dazu hat er an anderen Stellen schon viel zu oft geschrieben, dass man TryParse statt try { Parse } catch {} verwenden soll, um Exceptions zu vermeiden.

Ein Forum dient zum Informationsaustausch und zum erlernen von Tatsachen. Besteht die Gefahr das etwas falsch interpretiert wird, ist eine Korrektur oder Hinweise i.d.R. erwünscht. In diesem Forum fühlen sich gleich alle angegriffen und rechtfertigen sich mit Argumenten die völlig Irrelevant sind. Es ist doch vollkommen egal was Jack weiß oder was Du glaubst zu wissen was Jack weiß oder was andere User anhand des Postzählers oder Bekanntschaft glauben was Jack sagen wollte.

IMHO ist viel entscheidender, dass eine Aussage im Raum steht, die so interpretiert werden kann, dass TryParse mit try catch implementiert ist. Was um Himmelswillen spricht dann dagegen dies zu korrigieren - und für alle die es so interpretieren wie ich es getan habe (ja, ich kenne die Posts von Jack nicht und Postzähler sind mir vollkommen egal) der wichtige Hinweis kommt, das dem nicht so ist.

Zur Qualität der Beiträge möge jeder für sich die Frage beantworten, wie der Verlauf der Diskussion gewesen wäre, wenn jemand mit nur 5 Postpunkten geschrieben hätte, dass ein TryCatch so funktioniert: <Code mit einem try catch Block um Parse>

Hallo Knuddlbaer,

was ist dein Problem? Ich habe nur geschrieben, dass deine Unterstellung gegenüber JAck30lena falsch war. Das war sie und das musste gesagt werden. Ärgerlich ist, dass du daraus nicht gelernt hast und schon wieder mit einer indirekten Unterstellung kommst, das es bei den Posts um den Postingzähler ging. Bitte lass solche Unterstellungen. Nur darum geht es.

Das du die Sache inhaltlich klargestellt hast, war super.

herbivore

Ok um das hier aus der welt zu schaffen hier ein ausführlicherer beitrag zum tryparse:

  1. möglichkeit:
    du nimmst den string, klopfst ihn mit hilfe des übergebenen oder current- numberformats auf unstimmigkeiten ab (sehr sehr viel code....) und convertierst erst dann ,wenn alles ok ist.

zu beachten ist heirbei das du *auf vorzeichen *gruppierungszeichen *dezimaltrennzeichen *nummern als solches *korrekte abstände zwischen den gruppierungszeichen

achten musst.
all diese informationen sind im numberinfo der jeweiligen kultur hinterlegt. problematisch ist nur der aufbau, da es theoretisch sein kann das alle z.b. gruppierungszeichen mehrstellig sein können. das bedeutet, das es nciht wie bei uns ein "." gibt sondern vielleicht in einer sprache sowas wie ein "-.-.-." gibt. das sind dann einige for-schleifen die du gegen jedes mögliche zeichen schicken musst und dann hast du noch das problem mit den korrekten abständen zwischen gruppierungs-zeichensequenzen, welche auch unterschiedlich lang sein dürfen.

  1. möglichkeit:
    du nimmst die try-catch methode. ist zwar nciht frameworkäquivalent aber funktioniert trotzdem.