.NET格式化字符串 - 评论的良好做法?

时间:2009-09-22 18:21:10

标签: .net string-formatting

在.NET之前,我们有自己的短语本地化系统,我们建立了一种方式,使评论嵌套在格式化字符串中,如:“{0:price}”。随着岁月的流逝,我发现我越来越想念它。

似乎没有办法在.NET中原样记录格式化字符串:

string.Format("{0//numerator} / {1//denominator} = {2//ratio}"
              ,somevar
              ,anothervar
              ,yetanothervar);

特别是在插入点重新排序的本地化/用语中非常有用,而不需要更改代码:

string.Format("Dividing {1//denominator} into {0//numerator} gives {2//ratio}"
              ,somevar
              ,anothervar
              ,yetanothervar);

任何人都有任何技巧来记录这些,以避免在维护/本地化等条款重新安排时出错?

评论很重要的原因是,对于本地化和配置,通常,字符串不在包含变量的代码中 - 我已将它们放在资源文件,app.config和数据库中。

在实际示例中,子类控件公开PhraseID属性(控件映射到从表单生成的XML文件中的ID,表单控件即时翻译),因此子类表单执行如下操作:

// Handle the phrases without insertion points - this is in the base class
foreach (Control in this.Controls) {
    IXLatable ixl = (IXLatable) Control;
    ixl.Text = GetPhrase(ixl.PhraseID);
}

// in the individual form classes, they override the behavior for complex displays:
lnkPublish.Text = string.Format(GetPhrase(lnkPublish.PhraseID), filename, foldername, userid);

字典包含默认和本地化字符串,如:

phraseid, language code, phrase
1,en,"{0//filename} published to {1//foldername} by {2//userid}"
1,pl,"{2//userid} ublishedpay ethay ilefay {0//filename} otay {1//foldername}"

如果在默认短语中提供了注释,那么翻译人员(从未看过源代码)会错误地索引错误的可能性要小得多。非本地化的演讲者更容易解决翻译资源中的问题。

2 个答案:

答案 0 :(得分:4)

您可以查看Phil Haack's NamedFormat extension,它允许您使用

等格式
NamedFormat("{{{foo}}}", new {foo = 123})

答案 1 :(得分:2)

在您的示例中,将变量命名为有意义的,将与注释具有相同的效果。