26

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

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); 

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

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

4

5 回答 5

20

我确实认为这是一种必要的邪恶,我经常使用的一种。我做的很臭的事情是:

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

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

于 2009-06-08T02:43:24.793 回答
17

您想要这样做的原因有很多,但唯一重要的原因是您要将应用程序本地化为另一种语言。

如果您使用资源字符串,请记住几件事。

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

  2. 避免在格式标记中使用您的语言中的字符串。最好将这些用于数字。例如,消息:

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

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

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

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

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

于 2009-06-08T03:01:14.337 回答
3

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

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

Resharper 具有类似的功能

于 2009-06-08T03:10:17.813 回答
2

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

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

于 2009-06-08T02:45:14.947 回答
2

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

新的让我们看看如何

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

这每次都会给我动态信息

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

于 2016-09-21T17:39:31.553 回答