2009-05-14 4 views
2

J'implémente une méthode TryParse (chaîne s, résultat de l'objet Out). Si l'analyse échoue, je voudrais ne pas toucher le paramètre out afin que tout résultat précédent reste intact. Mais VS2k8 ne me laisse pas. Je dois définir la valeur de l'objet out, peu importe quoi.Quelle devrait être la valeur de sortie avec une méthode TryXX() infructueuse?

Devrais-je simplement mettre result = result pour plaire au compilateur? Est-ce que je manque quelque chose?

Répondre

6

Votre suggestion de result = result ne fonctionnera pas, car il est un paramètre out - il est certainement pas affecté à commencer, donc vous ne pouvez pas lire sa valeur jusqu'à ce que vous avez attribué une valeur.

result = null; 

est certainement la voie à suivre pour un paramètre object out. Fondamentalement, utilisez default(T) pour le type T que vous avez. (L'opérateur default est utile dans les méthodes génériques - pour le code non-générique je normalement juste utiliser null, 0, peu importe.)

EDIT: D'après le commentaire de Boris, il peut être la peine d'examiner la différence entre un paramètre ref et un paramètre out:

Out pour certains paramètres

  • ne pas doivent être définitivement attribué par l'appelant
  • Sont traités comme "pas définitivement affectés" au début de la méthode (vous ne pouvez pas lire la valeur sans l'affecter d'abord, comme une variable locale)
  • Devraient être définitivement affectés (par la méthode) avant la la méthode se termine normalement avant qu'il ne revienne; il peut lancer une exception sans attribuer une valeur au paramètre)

paramètres Ref

  • Do doivent être définitivement attribué par l'appelant
  • sont traités comme « définitivement attribué » au début de la méthode (de sorte que vous pouvez lire la valeur sans l'affecter en premier)
  • Vous ne devez pas être affecté à dans la méthode (ie vous pouvez laisser le paramètre avec son original v aleur)
+0

Donc, il est une procédure acceptée pour écraser toute valeur que l'out par avait en premier lieu? –

+1

C'est plus qu'accepté: c'est obligatoire. Un paramètre de sortie * doit * être définitivement assigné avant que la méthode ne se termine normalement (c'est-à-dire retourne plutôt que lance) –

+0

Il est impossible de faire autrement. C'est ce que 'out' signifie - la valeur du client sera (sur) écrite. L'avantage de «sortir» par rapport à «ref» est que le client n'a pas besoin de s'embêter à initialiser la variable, il peut simplement la déclarer, assuré qu'une certaine valeur «initiale» sera définie lorsqu'elle passera en position «out». – Brian

2
result = null; 
+0

Ensuite, je voudrais dftly toucher le paramètre. C'est essentiellement le boeuf de ma question. –

7

Assigner null (ou plus généralement (T)). Vous devez attribuer une valeur, c'est ce que signifie 'out'.

+0

Hmm, il semble être la compréhension commune qu'en effet ce serait le cas. Je voudrais plus si je pouvais avoir la possibilité de définir ma variable à une valeur de repli, puis faire un tryparse et travailler avec ma variable qui a maintenant soit une valeur valablement analysée ou la valeur de repli. –

+0

Vous pouvez le faire avec un paramètre 'ref', mais vous partez de ce qui est devenu (pour le meilleur ou pour le pire) le 'standard idiome'. – Brian

+0

@boris - la valeur de repli de la valeur par défaut (T) est sûre. En règle générale, le code appelant ne devrait même pas vraiment regarder cette valeur si on leur donne un 'false'. –

0

Il suffit de mettre une valeur par défaut. Par exemple, la méthode Int32.TryParse met zéro.

+0

Valeur par défaut signifie par défaut (T) pour être exact, non? – Kirtan

+0

Pour un type générique qui serait correct –

-3

Vous pouvez lever une exception avant le code qui est censé définir le résultat.

+4

Une méthode TryParse n'est pas vraiment censée déclencher une exception dans le cas d'une analyse non valide. Cela serait probablement considéré comme une violation du contrat implicite –

0

Vous pouvez utiliser ref au lieu de out si vous ne voulez pas attribuer de valeur, bien que cela doit ensuite être initialisé par l'appelant.

Questions connexes