代码之家  ›  专栏  ›  技术社区  ›  Cade Roux

.NET格式化字符串-注释的良好做法?

  •  6
  • Cade Roux  · 技术社区  · 16 年前

    在.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 回复  |  直到 16 年前
        1
  •  4
  •   Jon Galloway    16 年前

    你可以看看 Phil Haack's NamedFormat extension ,允许您使用以下格式

    NamedFormat("{{{foo}}}", new {foo = 123})
    
        2
  •  2
  •   AndreasN    16 年前

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

    推荐文章