避免魔术字符串和数字

我正在研究过去几年由各种程序员编辑过的应用程序,我偶然发现了使用String Literals访问MenuItems的问题。

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

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

要么

 mainMenu.MenuItems["View"].MenuItems["FullScreen"].Visible=true; 
  1. 如何更改用于标识MenuItem的字符串并捕获它用于访问的所有位置? 菜单和菜单项被声明为公共,并在整个大型应用程序中使用

  2. 什么是防止使用这些魔术索引的正确方法。 每次添加新项目或更改名称时,我都会预测会被破坏。

PS我已经开始使用枚举字典方法,其中每个menuItem都与一个键配对。 但这仍然不会强迫其他开发人员使用我的实现,也不是问题2的最优雅的解决方案

在WinForms设计器中为每个菜单项命名(我假设),然后通过该名称引用它。

在此处输入图像描述

然后在你的代码中使用它:

 menuExit.Visible = false; 

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

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

然后仍然通过menuExit名称访问它。 避免幻数和字符串的关键是直接引用你想要引用的内容。 作为奖励,您现在可以使用F2安全地重命名此可修复程序。

Romkyns的答案对于这种情况来说是正确的答案,但是如果你确实需要在代码中使用字符串文字,我会将它们保存在公共静态类中,例如:

 public static class Constants { public static class Menu { public static readonly string FirstMenuName = "Menu 1"; ... } public static class OtherCateogry { ... } } 

然后,您可以通过Constants.Menu.FirstMenuName访问它们。

至于最终阻止其他开发人员在整个代码中使用文字 – 你可能不得不求助于纠正之棒(坚固的金属尺);)。