代码之家  ›  专栏  ›  技术社区  ›  jpoh

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

  •  21
  • jpoh  · 技术社区  · 16 年前

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

    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 回复  |  直到 8 年前
        1
  •  17
  •   Michael Petrotta user3140870    16 年前

    我确实认为这是一种必要的邪恶,我经常使用它。我做的一些有味道的事情是:

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

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

        2
  •  16
  •   Nick Haddad    16 年前

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

    如果您使用的是资源字符串,那么需要记住以下几点。

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

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

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

      如果0和1是5和10这样的数字,那就太好了。如果在字符串“5”和“10”中格式化,这将使本地化变得困难。

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

      string somestring=string.format(properties.resources.integerrangeerror,minvalue,maxvalue);

    4. 评估您是否在代码的正确抽象级别生成用户可见的字符串。一般来说,我倾向于将代码中最接近用户界面的所有用户可见字符串分组。如果一些低级文件I/O代码需要提供错误,那么应该这样做,除了您在应用程序中处理的异常和一致的错误消息之外。这还将整合所有需要本地化的字符串,而不是让它们贯穿整个代码。

        3
  •  3
  •   Pat    11 年前

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

    一旦你写下你的字符串,你就可以访问coderush菜单并在一个步骤中提取到一个资源文件。很不错的。

    雷斯哈珀 similar functionality .

        4
  •  2
  •   Matthew Flaschen    16 年前

    我不明白为什么在程序中包含格式字符串是一件坏事。与传统的无证魔术数字不同,它一眼就能看出来。当然,如果您在多个地方使用格式字符串,那么必须将其存储在适当的只读变量中,以避免冗余。

    我同意把它放在资源中是不必要的间接性。如果您的程序需要本地化,并且您正在通过资源文件进行本地化,则可能会出现异常。

        5
  •  2
  •   Basheer AL-MOMANI    8 年前

    是的,你可以 enter image description here

    新的让我们看看

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

    每次都会给我动态信息

    顺便说一下,我在用 ResXManager