3

私は過去数年にわたってさまざまなプログラマーによって編集されたアプリケーションに取り組んでおり、文字列リテラルを使用してMenuItemsにアクセスする際の問題に遭遇しました。

例:多くの場所に次のようなコードがあります

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

また

mainMenu.MenuItems["View"].MenuItems["FullScreen"].Visible=true;
  1. MenuItemを識別し、アクセスに使用されているすべての場所をキャッチするために使用される文字列を変更するにはどうすればよいですか?メニューとmenuitemsはパブリックとして宣言され、この大規模なアプリケーション全体で使用されます

  2. これらのマジックインデックスの使用を防ぐ正しい方法は何ですか。新しいアイテムが追加されたり、名前が変更されたりするたびに、物事が壊れることを予見しています。

PS私は、すべてのmenuItemがキーとペアになっている列挙型辞書アプローチの使用を開始しました。しかし、これでも他の開発者に私の実装を使用させることはなく、質問2に対する最も洗練されたソリューションでもありません。

4

2 に答える 2

9

WinFormsデザイナで各メニュー項目に名前を付け(私が推測します)、その名前で参照します。

ここに画像の説明を入力してください

次に、これをコードで使用します。

menuExit.Visible = false;

メニュー項目がプログラムで追加される場合は、次のようにします。

class MyForm : Form
{
    private MenuItem menuExit;

    ...

        myMenu.Items.Add(menuExit = new MenuItem(...));

    ...
}

それでもmenuExit名前でアクセスします。マジックナンバーや文字列を回避するための鍵は、参照したいものを直接参照することです。ボーナスとして、F2を使用してこの変数の名前を安全に変更できるようになりました。

于 2012-06-19T11:25:11.330 に答える
0

Romkynsの答えはこのシナリオの正しい答えですが、コードで文字列リテラルを使用する必要がある場合は、常に次のようなパブリック静的クラスに保持します。

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

    public static class OtherCateogry
    {
        ...
    }
}

その後、によってそれらにアクセスできますConstants.Menu.FirstMenuName

他の開発者がコード全体でリテラルを使用することを確実に防ぐことに関しては、Rod of Correction(頑丈な金属定規)に頼らなければならない場合があります;)。

于 2012-06-19T12:59:50.277 に答える