我们应该在资源中存储格式字符串吗

对于我目前正在进行的项目,我必须将特殊格式的字符串提供给第三方服务进行处理。 所以我正在建立这样的字符串:

string someString = string.Format("{0}{1}{2}: Some message. Some percentage: {3}%", token1, token2, token3, number); 

而不是硬编码字符串,我正在考虑将其移动到项目资源中:

 string someString = string.Format(Properties.Resources.SomeString, token1, token2, token3, number); 

在我看来,第二个选项不像第一个选项那么可读,即阅读代码的人必须提取字符串资源以确定最终结果应该是什么样子。

我该如何解决这个问题? 在这种情况下,硬编码格式字符串是否是必要的恶魔?

我确实认为这是一个必要的邪恶,我经常使用它。 我做的有点臭,是:

 // "{0}{1}{2}: Some message. Some percentage: {3}%" string someString = string.Format(Properties.Resources.SomeString ,token1, token2, token3, number); 

..至少在代码足够稳定之前,我可能会因为别人看到的而感到尴尬。

您可能希望这样做有几个原因,但唯一的原因是您要将应用程序本地化为另一种语言。

如果您正在使用资源字符串,则需要记住几件事。

  1. 在您想要本地化的资源字符串集中尽可能包含格式字符串。 这将允许翻译者重新排序格式化项目的位置,以使它们更好地适应翻译文本的上下文。

  2. 避免使用您的语言格式的字符串。 最好将它们用于数字。 例如,消息:

    “您指定的值必须介于{0}和{1}之间”

    如果{0}和{1}是5和10之类的数字,那就太棒了。如果你在“五”和“十”这样的字符串格式化,这将使本地化变得困难。

  3. 您可以通过简单地命名资源来解决您所谈论的可读性问题。

    string someString = string.Format(Properties.Resources.IntegerRangeError,minValue,maxValue);

  4. 评估您是否在代码中的正确抽象级别生成用户可见字符串。 通常,我倾向于将最靠近用户界面的代码中的所有用户可见字符串分组。 如果某些低级文件I / O代码需要提供错误,则应该使用您在应用程序中处理的exception和一致的错误消息来执行此操作。 这也将整合所有需要本地化的字符串,而不是在整个代码中使用它们。

您可以做的一件事是帮助添加硬编码字符串甚至加快添加字符串到资源文件是使用CodeRush Xpress,您可以在这里免费下载: http : //www.devexpress.com/Products/Visual_Studio_Add-in/ CodeRushX /

编写字符串后,您可以访问CodeRush菜单并一步提取到资源文件。 非常好。

Resharper具有类似的function 。

我不明白为什么在程序中包含格式字符串是件坏事。 与传统的无证魔术数字不同,乍一看它的作用非常明显。 当然,如果您在多个位置使用格式字符串,它肯定应存储在适当的只读变量中以避免冗余。

我同意将其保留在资源中是不必要的间接。 可能的例外是,如果您的程序需要本地化,并且您正在通过资源文件进行本地化。

是的你可以 在此处输入图像描述

新的让我们看看如何

 String.Format(Resource_en.PhoneNumberForEmployeeAlreadyExist,letterForm.EmployeeName[i]) 

每次都会给我动态的消息

顺便说一句,我正在使用ResXManager