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

时间:2009-06-08 02:39:59

标签: c# localization resources string-formatting

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

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

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

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

5 个答案:

答案 0 :(得分:18)

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

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

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

答案 1 :(得分:16)

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

如果您正在使用资源字符串,请记住以下几点。

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

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

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

    之间 如果{0}和{1}是5和10之类的数字,则

    非常棒。如果您使用“五”和“十”之类的字符串进行格式化,这将使本地化变得困难。

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

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

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

答案 2 :(得分:3)

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

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

Resharper有similar functionality

答案 3 :(得分:2)

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

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

答案 4 :(得分:2)

是的,你可以 enter image description here

new让我们看看如何

# Python 2
(tensorflow)$ pip install --ignore-installed --upgrade $TF_BINARY_URL

# Python 3
(tensorflow)$ pip3 install --ignore-installed --upgrade $TF_BINARY_URL

每次都会给我动态消息

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

相关问题