printfn
и различные его кузены имеют ряд преимуществ:
- Они короче.
- Они могут сделать некоторые проверки статического типа; то есть
printfn "%d" "bad type"
не будет компилироваться.
- ... но вам не нужно выполнять проверку статического типа;
%O
печатает любой объект
- Они могут печатать «умного» представления для вещей, таких как массивы, кортежи и дискриминации союзов с
%A
- Они могут быть частично применены; то есть
printfn "%d, %d" 3
является допустимым выражением. Это особенно примечательно, поскольку компилятор может проверить, что вы фактически применяете правильное количество аргументов, когда вы позже используете это подвыражение - в отличие от Console.WriteLine
, который с радостью примет слишком много или слишком мало параметров.
На практике наиболее распространенное частичное приложение, скорее всего, будет содержать только строку формата; например
let printParticle = printfn "Particle at (%d, %d), state %A, p = %f"
printParticle 2 3 //compile time warning about ignored value
printParticle 3 4 someState 0.4 //fine
printParticle 5 6 someState 0.4 0.7 //compile-time error
Однако до F # 3.1, это также медленно. Это достаточно быстро, чтобы не отставать от вас кодер, но если вы используете его в какой-то форме сериализации, это может стать узким местом. F# 3.1 release announcement (который распространяется как часть Visual Studio 2013) утверждает, что он значительно улучшает производительность, хотя я еще не подтвердил это.
Лично я обычно использую printfn для поискового кодирования, а затем я в основном придерживаюсь %A
со случайным другим спецификатором, который был добавлен. Однако собственное строковое форматирование .NET по-прежнему полезно в некоторых случаях для его детальной культуры и форматирования, . Если вы хотите, чтобы прямая конкатенация максимальной скорости (или StringBuilder
) легко превзошла обоих, так как это позволяет избежать интерпретации строки формата.
Mono использует System.IO.TextWriter https://github.com/fsharp/fsharp/blob/master/src/fsharp/FSharp.Core/printf.fsi –
Спасибо за дополнительную информацию :) – OMGtechy