Système.Console.WriteLine() vs printfn en F#
Quelle est la différence entre les deux énoncés suivants en F#?
Sont-ils des avantages ou des inconvénients par rapport à l'autre (à l'exclusion de l'évidence de la syntaxe des différences)?
Je comprends que WriteLine() est une partie de .NET, mais ne comprennent pas les implications que cela pourrait avoir.
L'Exemple De Code:
printfn "This is an integer: %d" 5
System.Console.WriteLine("This is an integer: {0}" , 5)
- Mono utilise le Système.IO.TextWriter github.com/fsharp/fsharp/blob/master/src/fsharp/FSharp.Core/...
- Merci pour la petite info en plus 🙂
Vous devez vous connecter pour publier un commentaire.
printfn
et de ses divers cousins ont plusieurs avantages:printfn "%d" "bad type"
ne compilera pas.%O
imprime tout objet%A
printfn "%d, %d" 3
est une expression valide. Cela est particulièrement astucieux car le compilateur pouvez vérifier que vous avez réellement appliquer le bon nombre d'arguments plus tard lorsque vous utilisez cette sous-expression - à la différence deConsole.WriteLine
qui seront heureux de vous accueillir trop nombreux ou trop peu de paramètres.Dans la pratique, le plus commun de l'application partielle est susceptible d'inclure uniquement le format de chaîne de caractères; par exemple,
Toutefois, avant de le F# 3.1, il est également lent. C'est beaucoup assez rapidement pour suivre avec vous le codeur, mais si vous l'utilisez dans une certaine forme de sérialisation, il pourrait se transformer en un goulot d'étranglement. Le F# version 3.1 annonce (qui est distribué dans le cadre de Visual Studio 2013) les revendications pour améliorer les performances de façon spectaculaire, si je n'ai pas vérifié cela.
Personnellement, j'utilise habituellement printfn exploratoire de codage, et puis j'ai largement en tenir à
%A
à l'occasion d'autres spécificateur de levée. Cependant, l' .NET natif de chaîne de formatage est toujours utile dans certains cas pour ses détaillée de la culture et mise en forme des options liées. Si vous voulez de la vitesse maximale direct de concaténation (ou unStringBuilder
) performant à la fois car cela évite d'interpréter la chaîne de format.printfn
et les fonctions connexes doit généralement être utilisé à la place deConsole.WriteLine()
, mais il vaut la peine de mentionner qu'ils sont aussi relativement lente (qui peut pour certains cas d'utilisation).Ici sont quelques-uns des avantages et des inconvénients de
printf
-comme des fonctions par rapport àConsole.WriteLine
.Pour:
printfn
fonctions sont de type sécurisé:Il est facile de faire une application partielle avec
printfn
, ce qui n'est pas le cas avecConsole.WriteLine
en raison d'un certain nombre de surcharges:printfn
support de types F# meilleure via%A
spécificateur.Contre:
Outre de ne pas être en mesure de réutiliser les paramètres comme @mydogisbox mentionné,
printfn
-comme les fonctions sont beaucoup plus lents queConsole.WriteLine
(en raison de l'utilisation de la réflexion); vous ne devriez pas utiliser l'ancien pour l'enregistrement de but.La printfn fonction peut être partiellement appliquées.
Comme la norme .NET les fonctions de tuples en tant que paramètres en F#, vous ne pouvez pas utiliser l'application partielle de là.
Un deuxième avantage de printfn, c'est que les arguments sont tapés. Donc, ce ne compile pas:
Outre le style, la
System.Console.WriteLine
a l'avantage de pouvoir réutiliser les paramètres, c'est à direSystem.Console.WriteLine("This is a integer twice: {0} {0}", 5)
Aussi, comme l'a noté ici, vous pouvez faire à peu l'impression de F# objet à l'aide de
printfn
laquelle vous ne pouvez pas faire avecSystem.Console.WriteLine
et depuis il ne prend pas un n-uplet, vous pouvez faire une application partielle avec elle.Comme indiqué par d'autres,
printfn
utilise la réflexion et est donc beaucoup plus lent quePrintLine
, mais aussi est typesafe.