C# 避免使用神奇的字符串和数字

C# 避免使用神奇的字符串和数字,c#,enums,menuitem,magic-numbers,C#,Enums,Menuitem,Magic Numbers,我正在开发一个应用程序,在过去的几年里,该应用程序已经被不同的程序员编辑过,我偶然发现了一个使用字符串文本访问菜单项的问题 例如:在许多地方都有类似的代码 mainMenu.MenuItems[1].MenuItems[0].Visible=true; 或 如何更改用于标识MenuItem并捕获其用于访问的所有位置的字符串?菜单和菜单项被声明为公共的,并在整个大型应用程序中使用 防止使用这些神奇索引的正确方法是什么。每次添加新项目或更改名称时,我都会看到东西被破坏 另外,我已经开始使用枚举字典

我正在开发一个应用程序,在过去的几年里,该应用程序已经被不同的程序员编辑过,我偶然发现了一个使用字符串文本访问菜单项的问题

例如:在许多地方都有类似的代码

mainMenu.MenuItems[1].MenuItems[0].Visible=true;

  • 如何更改用于标识MenuItem并捕获其用于访问的所有位置的字符串?菜单和菜单项被声明为公共的,并在整个大型应用程序中使用

  • 防止使用这些神奇索引的正确方法是什么。每次添加新项目或更改名称时,我都会看到东西被破坏


  • 另外,我已经开始使用枚举字典方法,其中每个menuItem都与一个键配对。但这仍然不会迫使其他开发人员使用我的实现,也不是问题2最优雅的解决方案。在WinForms designer中为每个菜单项指定一个名称(我假设),然后用该名称引用它

    然后在代码中使用以下命令:

    menuExit.Visible = false;
    

    如果以编程方式添加菜单项,请执行以下操作:

    class MyForm : Form
    {
        private MenuItem menuExit;
    
        ...
    
            myMenu.Items.Add(menuExit = new MenuItem(...));
    
        ...
    }
    

    然后仍然通过
    菜单exit
    名称访问它。避免使用神奇数字和字符串的关键是,只需直接引用您想要引用的内容。作为奖励,您现在可以使用F2安全地重命名此VARABLE。

    Romkyns答案对于此场景是正确的,但是如果您确实需要在代码中使用字符串文字,我会将它们保存在公共静态类中,例如:

    public static class Constants
    {
        public static class Menu 
        {
            public static readonly string FirstMenuName = "Menu 1";
            ...
        }
    
        public static class OtherCateogry
        {
            ...
        }
    }
    
    然后,您可以通过
    Constants.Menu.FirstMenuName
    访问它们


    至于明确防止其他开发人员在整个代码中使用文字,您可能必须求助于校正棒(坚固的金属尺);)

    您不能强迫其他开发人员不使用magic字符串,但您可以在开发人员会议上强调这种行为的负面影响,并使其在开发人员文档中突出显示,应该避免使用。有很多有效的方法可以将这一点传递给整个团队。您甚至可以尝试将其纳入公司开发人员指南中!抱歉,它们都是使用新菜单项(“字符串”)以编程方式添加的;谢谢,现在来看看所有使用字符串文字的地方怎么样?@johnhmm。。。在
    菜单项上尝试“查找符号”
    ?(将光标放在菜单项上,然后按Shift+F12)。
    public static class Constants
    {
        public static class Menu 
        {
            public static readonly string FirstMenuName = "Menu 1";
            ...
        }
    
        public static class OtherCateogry
        {
            ...
        }
    }