今天在使用菜单注意到这样一个情况:
private MainMenu myMainMenu;
private MenuItem menuitemFile;
private MenuItem menuitemUD;myMainMenu=new MainMenu();
//menuitemFile=new MenuItem();  //menuitemFile并未先进行实例化,下面的代码也正确。
menuitemFile=myMainMenu.MenuItems.Add("&File");
menuitemUD=new MenuItem();     //这里需先实例化,后面的代码才不会出错。
menuitemUD.Text="Update &Date";//请问menuitemFile和menuitemUD都是MenuItem对象,上面的使用有什么区别?面向对象的语言里好像经常碰到类似问题--有时需先实例化再使用,有时却不用先实例化。

解决方案 »

  1.   

    今天在使用菜单注意到这样一个情况:
    private MainMenu myMainMenu;
    private MenuItem menuitemFile;
    private MenuItem menuitemUD;myMainMenu=new MainMenu();
    //menuitemFile=new MenuItem();  //menuitemFile并未先进行实例化,下面的代码也正确。
    menuitemFile=myMainMenu.MenuItems.Add("&File");
    menuitemUD=new MenuItem();     //这里需先实例化,后面的代码才不会出错。
    menuitemUD.Text="Update &Date";因为myMainMenu.MenuItems.Add("&File");返回的是MenuItem类型吧?而下面的代码,你的menuitemUD对象未实例化你就调用它的属性,当然不行
    menuitemUD=new MenuItem();     //这里需先实例化,后面的代码才不会出错。
    menuitemUD.Text="Update &Date";
      

  2.   

    观察发现其返回值是整型的:public virtual new System.Int32 Add ( System.Int32 index , System.Windows.Forms.MenuItem item )
    整型值赋给一个MenuItem变量更加让人费解了!!
      

  3.   

    今天在使用菜单注意到这样一个情况:
    private MainMenu myMainMenu;
    private MenuItem menuitemFile;
    private MenuItem menuitemUD;
    下面的代码在一个方法里面,
    方法的调用又先后顺序,
    编译器只能认为,可能在另一个方法中已经赋值,然后再调用这个方法,
    如果是这样,不可能出什么错误,
    所以编译器肯定不能自动判断!!!拜托以后代码要贴全!
    至少要说明!
    否则这直接存在语法错误的代码,
    一般很少有人有耐心跟你猜来猜去……myMainMenu=new MainMenu();
    //menuitemFile=new MenuItem();  //menuitemFile并未先进行实例化,下面的代码也正确。
    menuitemFile=myMainMenu.MenuItems.Add("&File");
    menuitemUD=new MenuItem();     //这里需先实例化,后面的代码才不会出错。
    menuitemUD.Text="Update &Date";
      

  4.   

    观察发现其返回值是整型的:public virtual new System.Int32 Add ( System.Int32 index , System.Windows.Forms.MenuItem item )Add( int, MenuItem )menuitemFile=myMainMenu.MenuItems.Add("&File");Add( string )
    这两个方法难道是一个?!
      

  5.   

    是一个方法的重载形式,返回值都是int
      

  6.   

    要贴全的,在这里,里面还有另外一个问题,有心的朋友也帮我解答一下吧!using System;
    using System.Windows.Forms;
    using System.Drawing;public class frmApp:Form
    {
    private Label myDateLabel;
    private MainMenu myMainMenu; private MenuItem menuitemFile;
    private MenuItem menuitemUD;
    private MenuItem menuitemActive;
    private MenuItem menuitemExit;
    private MenuItem menuitemHelp;
    private MenuItem menuitemAbout; public frmApp()
    {
    InitializeComponent();
    } private void InitializeComponent()
    {
    this.Text="STY Menus";
    this.StartPosition=FormStartPosition.CenterScreen;
    this.FormBorderStyle=FormBorderStyle.Sizable; myDateLabel=new Label();
    DateTime currDate=new DateTime();
    currDate=DateTime.Now;
    myDateLabel.Text=currDate.ToString();
    myDateLabel.AutoSize=true;
    myDateLabel.Location=new Point(50,70);
    myDateLabel.BackColor=this.BackColor;
    this.Controls.Add(myDateLabel);
    this.Width=(myDateLabel.PreferredWidth+100); CreateMyMenu();
    } public void CreateMyMenu()
    {
    myMainMenu=new MainMenu();
    //menuitemFile=new MenuItem(); //
    menuitemFile=myMainMenu.MenuItems.Add("&File"); menuitemUD=new MenuItem();
    menuitemUD.Text="Update &Date";
    menuitemUD.Shortcut=Shortcut.CtrlD;
    menuitemUD.Click+=new System.EventHandler(this.MenuUpdate_Selection);
    //menuitemUD.Checked=true;
    menuitemFile.MenuItems.Add(menuitemUD); menuitemExit=new MenuItem();
    menuitemExit.Text="E&xit";
    menuitemExit.Shortcut=Shortcut.CtrlX;
    menuitemExit.ShowShortcut=false;
    menuitemExit.Click+=new System.EventHandler(this.FileExit_Selection);
    menuitemFile.MenuItems.Add(menuitemExit); menuitemHelp=myMainMenu.MenuItems.Add("&Help"); menuitemActive=new MenuItem();
    menuitemActive.Text="Active";
    menuitemActive.Click+=new System.EventHandler(this.ActiveMenu_Selection);
    menuitemActive.Checked=true;
    menuitemHelp.MenuItems.Add(menuitemActive); menuitemAbout=new MenuItem();
    menuitemAbout.Text="&About";
    menuitemAbout.Shortcut=Shortcut.CtrlA;
    menuitemAbout.ShowShortcut=false;
    menuitemAbout.Click+=new System.EventHandler(this.FileAbout_Selection);
    menuitemHelp.MenuItems.Add(menuitemAbout); this.Menu=myMainMenu;
    } protected void ActiveMenu_Selection(object sender,System.EventArgs e)
    {
    MenuItem tmp;
    tmp=(MenuItem)sender;
    if(tmp.Checked==true) //这里的object sender是值传递还是引用传递,如果说是值传递的话,修改tmp的属性,不应该影响到那个触发此事件的菜单项的属性吧?
    tmp.Checked=false;
    else
    tmp.Checked=true;
    }
    protected void MenuUpdate_Selection(object sender,System.EventArgs e)
    {
    DateTime currDate=new DateTime();
    currDate=DateTime.Now;
    this.myDateLabel.Text=currDate.ToString();
    } protected void FileExit_Selection(object sender,System.EventArgs e)
    {
    this.Close();
    } protected void FileAbout_Selection(object sender,System.EventArgs e)
    {
    //
    MessageBox.Show("test");
    } public static void Main(string[] args)
    {
    new frmApp().ShowDialog();
    }
    }
      

  7.   

    public virtual MenuItem Add(string caption);
    我该怎么说?
      

  8.   

    噢,看错了一个重载形式,
    谢谢楼上的,
    不过还是没说明使用这种形式:
    menuitemFile=myMainMenu.MenuItems.Add("&File");
    时不用先对menuitemFile实例化?
    是意味着方法返回的就是对象(类的实例),而不是类吗?
      

  9.   

    整个简单的,就比如说:string s = "s";
    bool b = s.Equal("s");了解?