初学者 .Net 课程:字符串格式

根据关于连接的文章,我们已经看到使用StringBuilder对于性能来说是非常重要的。在这里,我们将看到如何格式化一个字符串,一个句子,这种格式化通常是使用的。

为什么使用字符串格式化?

我不会告诉你这更高效,相反,根据一个简单的测试,string.Format()的开销比连接字符串多几毫秒:

string nom = "Dupont";
string prenom = "Julie";
string adresse = "Rue de l'étoile";
string numero = "10";
string codePostal = "75000";
string ville = "Paris";

//我使用Stopwatch来计时我的代码
Stopwatch s = new Stopwatch();
//我启动Stopwatch
s.Restart();
for(int i=0; i < 100000; i++)
{
string monMessage = string.Format("Bonjour {0} {1}, je vous écris pour vous demander de m'envoyez mon colis à {2}, {3} - {4} {5}",
                                   nom, prenom, adresse, numero, codePostal, ville);
}
//我停止Stopwatch
s.Stop();
//我显示结果
Console.WriteLine(String.Format("Temps: {0}", s.Elapsed));
s.Restart();
for(int i=0; i < 100000; i++)
{
string monMessage = "Bonjour " + nom + " " + prenom + ", je vous écris pour vous demander de m'envoyer mon colis à " +
                     adresse + ", " + numero + " - " + codePostal + " " + ville;
}
s.Stop();
Console.WriteLine(String.Format("Temps: {0}", s.Elapsed));

//结果:
//string.format -> Temps: 00:00:00.0378547
//连接 -> Temps: 00:00:00.0134245

代码的第二部分比第一部分的代码可读性差,你有没有注意到我们使用string.Format()而不是通过+连接变量?

string.Format()是一个很好的习惯,它更具可读性,但你会在后面看到我们可以管理字符串的输出格式。

如我们所见,只需在大括号(或方括号){x}中放入要替换的值的索引,注意这一点:

int i = 0;
int x = 100;
string.Format("Ma Valeur est {0}, par contre x est égale à {1}", i, x);

//结果:
//Ma Valeur est 0, par contre x est égale à 100

//这与以下内容不同:

string.Format("Ma Valeur est {1}, par contre x est égale à {0}", i, x);
//结果:
//Ma Valeur est 100, par contre x est égale à 0

在上面的例子中,在第二行,第一个索引是{1},因此它不会取i,因为i在零位置(是的,在计算机中,我们总是从零开始,而不是从1),位置{1}是x,而索引{0}是零位置的值,因此是i。

你明白了吗?

我总结一下,应该避免这种类型的连接:

string nom = "Dupont";
string prenom = "Julie";
string adresse = "Rue de l'étoile";
string numero = "10";
string codePostal = "75000";
string ville = "Paris";
string monMessage = "Bonjour " + nom + " " + prenom + ", je vous écris pour vous demander de m'envoyer mon colis à " +
                                      adresse + ", " + numero + " - " + codePostal + " " + ville;
Console.WriteLine(monMessage);

//结果:
//Bonjour Dupont Julie, je vous écris pour vous demander de m'envoyer mon colis à Rue de l'étoile, 10 - 75000 Paris

而是:

string nom = "Dupont";
string prenom = "Julie";
string adresse = "Rue de l'étoile";
string numero = "10";
string codePostal = "75000";
string ville = "Paris";
string monMessage = string.Format("Bonjour {0} {1}, je vous écris pour vous demander de m'envoyez mon colis à {2}, {3} - {4} {5}",
                                    nom, prenom, adresse, numero, codePostal, ville);
Console.WriteLine(monMessage);

//结果:
//Bonjour Dupont Julie, je vous écris pour vous demander de m'envoyer mon colis à Rue de l'étoile, 10 - 75000 Paris

另一个优点

这里开始变得更有趣了,借助string.Format(),我们可以直接格式化一个值,如下所示:

int salaire = 1000;
int heureDeTravail = 16;
string monMessage = string.Format("Mon patron me paye {0:0.00}€ par mois pour {1:0#} h de travail par jour.", salaire, heureDeTravail);
Console.WriteLine(monMessage);
//Mon patron me paye 1000,00€ par mois pour 16 h de travail par jour.

heureDeTravail = 1;
monMessage = string.Format("Mon patron me paye {0:0####.00}€ par mois pour {1:0#} h de travail par jour.", salaire, heureDeTravail);
Console.WriteLine(monMessage);
//Mon patron me paye 01000,00€ par mois pour 01 h de travail par jour.

monMessage = string.Format("Nous sommes le {0}", DateTime.Now);
Console.WriteLine(monMessage);
//Nous sommes le 23-04-19 16:53:54

monMessage = string.Format("Nous sommes le {0:dd-MM-yyyy}", DateTime.Now);
Console.WriteLine(monMessage);
//Nous sommes le 23-04-2019

如我们所见,我们可以直接按所需格式化值,这在连接时会更长。

另一个优点是,当您从数据库或资源文件中获取一个句子,但这个句子每次都必须包含不同的值时,只需按如下格式化:

//这里我们从资源文件或数据库中获取一个句子
//无论句子来自哪里,这只是一个例子
string.Format(resource.GetString("MaPhraseDansMonFichierDeRessource"), adresse, codePostal, ville);

//MaPhraseDansMonFichierDeRessource = "我住在 {0},邮政编码 {1},城市 {2}"

简短变体

在 C# 6 (Roslyn) 中,从 Visual Studio 2015 开始,有一个更简短的 string.Format() 版本(需要添加 Microsoft.Net.Compilers 包以使用新的 C# 功能):

string monMessage = string.Format("今天是 {0:dd-MM-yyyy}", DateTime.Now);
Console.WriteLine(monMessage);
//结果: 今天是 23-04-2019

monMessage = $"今天是 {DateTime.Now:dd-MM-yyyy}";
Console.WriteLine(monMessage);
//结果: 今天是 23-04-2019

第二行展示了一个稍微不同的 string.Format(),我们以 $(美元符号)开头,然后在大括号中直接替换了第一行中的零索引。

格式说明符 描述 示例 结果
C 或 c 货币 string s = $"{2.5:C}";

string s = $"{-2.5:C}";
$2.50

($2.50)
D 或 d 十进制 string s = $"{25:D5}"; 00025
E 或 e 指数 string s = $"{250000:E2}"; 2.50E+005
F 或 f 固定点 string s = $"{2.5:F2}";

string s = $"{2.5:F0}";
2.50

3
G 或 g 一般 string s = $"{2.5:G}"; 2.5
N 或 n 数字 string s = $"{2500000:N}"; 2,500,000.00
P 或 p 百分比 string s = $"{0.25:P}"; 25.00%
R 或 r 往返 string s = $"{2.5:R}"; 2.5
X 或 x 十六进制 string s = $"{250:X}";

string s = $"{0xffff:X}";
FA

FFFF

还有很多其他的!

有关 string.Format() 的更多信息,请查看 Microsoft 网站上的文档: https://docs.microsoft.com/fr-FR/dotnet/api/system.string.format?redirectedfrom=MSDN&view=netframework-4.8#System_String_Format_System_String_System_Object_

在编译时,这没有改变,美元符号被 string.Format() 转换,这只是一个习惯问题,但我觉得这样更易读!

Aucun commentaire pour le moment.

Une erreur s'est produite. Cette application peut ne plus répondre jusqu'à ce qu'elle soit rechargée.Veuillez contacter l'auteur. Reload 🗙