C#:没有宏定义吗?那么,C#如何在绩效方面应对这种情况?

C#:没有宏定义吗?那么,C#如何在绩效方面应对这种情况?,c#,performance,macros,C#,Performance,Macros,我有一个管理语言选择的函数 In LanguageSelection.cs public static class LanguageSelection{ public enum Language{ English, Chinese, Malay, Tamil, Korean, French, Spanish, Hindi, Arabic, Portugese, Bengali, Russian, Japanese, Javanese }; private static Lang

我有一个管理语言选择的函数

In LanguageSelection.cs

public static class LanguageSelection{
    public enum Language{ English, Chinese, Malay, Tamil, Korean, French, Spanish, Hindi, Arabic, Portugese, Bengali, Russian, Japanese, Javanese };
    private static Language selectedLanguage;
    public static Language SelectedLanguage{
        get{
            return selectedLanguage;
        }
    }
    public static void ChangeLanguage (Language language){
         selectedLanguage = language;
    }
    public static string SelectLanguageString(string inEnglish, string inChinese, string inMalay, string inTamil, string inKorean, string inFrench, string inSpanish, string inHindi, string inArabic, string inPortugese, string inBengali, string inRussian, string inJapanese, string inJavanese){
        switch(selectedLanguage){
        case Language.English:
            return inEnglish;
        case Language.Chinese:
            return inChinese;
        case Language.Malay:
            return inMalay;
        case Language.Tamil:
            return inTamil;
        case Language.Korean:
            return inKorean;
        case Language.French:
            return inFrench;
        case Language.Spanish:
            return inSpanish;
        case Language.Hindi:
            return inHindi;
        case Language.Arabic:
            return inArabic;
        case Language.Portugese:
            return inPortugese;
        case Language.Bengali:
            return inBengali;
        case Language.Russian:
            return inRussian;
        case Language.Japanese:
            return inJapanese;
        case Language.Javanese:
            return inJavanese;
        }
        Debug.LogError("Language specified not in parameter list!");
        return string.Empty;
    }
}
功能的使用:

In myApplication.cs

using UnityEngine;
using UnityEngine.UI;

public class myApplication : MonoBehaviour {
    [SerializeField] private Text myText;
    public int damage;

    void Update(){
        myText.text = LanguageSelection.SelectLanguageString("Hi"+damage+"Hi","早上"+damage+"早上","pagi"+damage+"pagi","காலை"+damage+"காலை","아침"+damage+"아침","matin"+damage+"matin","Mañana"+damage+"Mañana","सुबह"+damage+"सुबह","صباح"+damage+"صباح","manhã"+damage+"manhã","সকাল"+damage+"সকাল","утро"+damage+"утро","朝"+damage+"朝","morning"+damage+"morning");
    }
}
C#是否会为每个参数创建一个字符串,每次为每个字符串创建一个字符,并将其传递到函数中,然后丢弃不需要的字符串?还请注意,它位于更新循环中

如果你对上一个问题的回答是否定的,你能解释一下C#handles这个问题吗?今天我想学点新东西。 如果您对上一个问题的回答是肯定的,那将是对处理能力的不合理浪费。你认为可能有哪些替代方案

这样的东西也许可以阻止C#浪费这么多处理能力

In LanguageSelection.cs, at the top of the file.

#define MACRO_SELECTLANGUAGESTRING(inEnglish,inChinese,inMalay,inTamil,inKorean,inFrench,inSpanish,inHindi,inArabic,inPortugese,inBengali,inRussian,inJapanese,inJavanese)\
    switch(LanguageSelection.SelectedLanguage){\
        case Language.English:\
            return inEnglish;\
        case Language.Chinese:\
            return inChinese;\
        case Language.Malay:\
            return inMalay;\
        case Language.Tamil:\
            return inTamil;\
        case Language.Korean:\
            return inKorean;\
        case Language.French:\
            return inFrench;\
        case Language.Spanish:\
            return inSpanish;\
        case Language.Hindi:\
            return inHindi;\
        case Language.Arabic:\
            return inArabic;\
        case Language.Portugese:\
            return inPortugese;\
        case Language.Bengali:\
            return inBengali;\
        case Language.Russian:\
            return inRussian;\
        case Language.Japanese:\
            return inJapanese;\
        case Language.Javanese:\
            return inJavanese;\
        }\
        Debug.LogError("Language specified not in parameter list!");\
        return string.Empty;\
    }\
并按如下方式使用:

In myApplication.cs
myText.text = MACRO_SELECTLANGUAGESTRING("Hi"+damage+"Hi","早上"+damage+"早上","pagi"+damage+"pagi","காலை"+damage+"காலை","아침"+damage+"아침","matin"+damage+"matin","Mañana"+damage+"Mañana","सुबह"+damage+"सुबह","صباح"+damage+"صباح","manhã"+damage+"manhã","সকাল"+damage+"সকাল","утро"+damage+"утро","朝"+damage+"朝","morning"+damage+"morning");
我知道C#不允许这样的宏定义,所以你们的方法是什么?我很想听

最后是需求

要求
  • 我希望能够在不影响性能的情况下添加数百种语言
  • 我希望能够在每种语言中键入一个长句,而不会对性能产生任何明显影响。例如:“橙子是一种圆形的红黄色水果,来自一棵在冬天收获的中等大小的树,含有人体血液活力所必需的维生素C。目前橙子的价格是“+calculateCost()+”美元”
  • 出于可维护性原因,我不想将MACRO_SELECTLANGUAGESTRING的内容复制并粘贴到每一个实例中
  • 字符串可能包含一个或多个埋在字符串中某处的数值,这些数值的位置可能因语言而异。这些数值可能会在每帧更新几次

  • 我希望以这样一种方式进行编码:每当我添加一种新语言时,我不需要手动查找可能导致我遗漏某些语言词典的每个实例,相反,我希望将其卸载到编译器,并使其为我提供一个“方法‘MACRO_SELECTLANGUAGESTRING’不重载‘X’参数”调用该函数的每个实例都有错误。(就此作出答复)

  • 谢谢。

    一般的经验法则是,如果你觉得有什么地方不对,而你又不能完全纠正它,那通常不是语言问题,而是你试图完成它的方式问题。当然,每一条规则都有例外,但在这种情况下,看起来你试图通过一个圆孔来安装一个方形的销钉

    我会使用的策略是——我真的会用任何语言,而不仅仅是C语言——将这些东西放入外部文件或嵌入资源中,并在第一次使用时将其解析为适当的数据结构

    例如(SAN解析):

    var dict=新字典
    {
    {Language.English,“Hi{0}Hi”},
    {语文.中文,”早上{0}早上" }
    };
    text=string.Format(dict[selectedLanguage],损坏);
    
    我尝试使用resx作为解决方案,但仍然不知道如何在Unity中加载resx文件

    我已经找到了另一个解决我的问题的方法,使用了一个有人创建的Unity包。 链接此处

    它非常容易使用。这是我第一次在不到30分钟的时间内学会如何使用SDK。它的语言数据库中包含了如此多的语言,甚至支持音频、预制和其他类型

    这是unity的资产商店中唯一一个免费的本地化软件包,拥有4颗星,并经过100多人的审查。
    我不是在为他们做广告。只是在这里为别人寻找解决方案。

    而不是使用长<代码>开关case ,你可以考虑使用<代码>字典<代码>。我在过去的10分钟里一直在头脑风暴中讨论如何实现字典来解决这个问题,但是我不知道如何以及从哪里开始。nuage type与我假设的“Hi”是不同版本的。然后选择所需的一个并进行一次连接。@juharr另外,请注意,变量“damage”每帧可能会更改几次,因此我无法仅进行一次字符串连接。编辑:我更改了“damage”“从私人到公共。有一些处理国际化的模式是有原因的。试着使用它们。你的建议无法扩展。嗯,这听起来是一个很好的解决方案。我会使用它,并在(如果)的时候回到这里。”我遇到了任何进一步的问题。谢谢!我希望以这样的方式编写代码:每当我添加一种新的语言时,我不需要手动查找可能导致我错过某些语言词典的每个实例,相反,我希望将其卸载到编译器中,并让它给我一个“方法“MACRO\u SELECTLANGUAGESTRING”没有重载接受“X”参数"调用该函数的每个实例都有错误。我也会在原始帖子中添加此注释。这是我对您提出的解决方案的问题。有人有任何其他解决方案可以满足所有这些合理要求吗?我肯定define macros有,但C#中没有。另外,为什么我不能添加@tag?如果您正在解析从文件中删除字符串,您可以让它验证是否存在所有语言。
    var dict = new Dictionary<Language,string>
    {
        { Language.English, "Hi{0}Hi" },
        { Language.Chinese, "早上{0}早上" }
    };
    
    text = string.Format(dict[selectedLanguage], damage);