Разница между String, FormattableString, IFormattable
FormattableString
Введено в C# 6.0. Как мы можем использовать то же форматирование строки, используя string
возразить, почему есть необходимость использования FormattableString
или же IFormattable
, Какая разница между тремя?
Мой код
var name = "Pravin";
var s = $"Hello, {name}";
System.IFormattable s1 = $"Hello, {name}";
System.FormattableString s2 = $"Hello, {name}";
Прежде всего, это дает тот же результат. т.е. 'Hello Pravin'.
Могу ли я получить более подробный ответ на этот вопрос, если у кого-то есть глубокие знания о том же.
1 ответ
FormattableString
это новый тип в.NET 4.6, и компилятор будет использовать его, только если вы попытаетесь его использовать. Другими словами, тип интерполированного строкового литерала обычно string
- построен с string.Format
- но может быть FormattableString
(с помощью FormattableStringFactory
) если вы попросите об этом.
FormattableString
состоит из строки формата, которая будет передана string.Format
(например "Hello, {0}"
) и аргументы, которые будут переданы для его форматирования. Важно отметить, что эта информация собирается до форматирования.
Это позволяет вам соответствующим образом настроить форматирование - чаще всего для его выполнения в инвариантной культуре, часто с Invariant
статический метод.
Когда вы назначаете интерполированный строковый литерал IFormattable
переменная, которая будет использовать FormattableString
тоже. IFormattable.ToString(string, CultureInfo)
В этом случае реализация игнорирует первый аргумент, вероятно, поэтому использует явную реализацию интерфейса.
Образец кода:
using System;
using System.Globalization;
using System.Threading;
using static System.FormattableString;
class Test
{
static void Main()
{
var uk = CultureInfo.CreateSpecificCulture("en-GB");
Thread.CurrentThread.CurrentCulture = uk;
var germany = CultureInfo.CreateSpecificCulture("de-DE");
string now = $"Default: it is now {DateTime.UtcNow}";
Console.WriteLine(now); // UK format
IFormattable x = $"Specific: It is now {DateTime.UtcNow}";
Console.WriteLine(x.ToString("ignored", germany));
FormattableString y = $"FormattableString: It is now {DateTime.UtcNow}";
Console.WriteLine(FormattableString.Invariant(y));
// Via using static
Console.WriteLine(Invariant($"It is now {DateTime.UtcNow}"));
}
}
Пример результатов:
Default: it is now 16/02/2016 07:16:21
Specific: It is now 16.02.2016 07:16:21
FormattableString: It is now 02/16/2016 07:16:21
It is now 02/16/2016 07:16:21
Кроме того, https://www.meziantou.net/interpolated-strings-advanced-usages.htm охватывает некоторые примеры того, что FormattableString позволяет вам делать (например, автоматическая параметризация операторов SQL).
например
void ExecuteNonQuery(DbConnection connection, FormattableString formattableString)
{
using (var command = connection.CreateCommand())
{
// Replace values by @p0, @p1, @p2, ....
var args = Enumerable.Range(0, formattableString.ArgumentCount).Select(i => (object)("@p" + i)).ToArray();
command.CommandType = System.Data.CommandType.Text;
command.CommandText = string.Format(formattableString.Format, args);
// Create parameters
for (var i = 0; i < formattableString.ArgumentCount; i++)
{
var arg = formattableString.GetArgument(i);
var p = command.CreateParameter();
p.ParameterName = "@p" + i;
p.Value = arg;
command.Parameters.Add(p);
}
// Execute the command
command.ExecuteNonQuery();
}
}
using (var sqlConnection = new SqlConnection())
{
sqlConnection.Open();
ExecuteNonQuery(sqlConnection, $@"UPDATE Customers SET Name = {"Meziantou"} WHERE Id = {1}");
}