这些对象在功能上是否相同?

Are these objects functionally equal?

我正在为表单按钮创建上下文菜单,我遇到了这种实现方式,它与我预期的不同。如果两者之间有什么区别,我能解释一下吗?

我认为它的工作方式:

private void InitializeContextMenu()
{
    System.Windows.Forms.ContextMenuStrip set_is_in_inventory = new System.Windows.Forms.ContextMenuStrip();
}

private System.Windows.Forms.ContextMenuStrip set_is_in_inventory;

我在msdn上找到的方式:

private void InitializeContextMenu()
{
    set_is_in_inventory = new System.Windows.Forms.ContextMenuStrip();
    this.ContextMenuStrip = set_is_in_inventory;
}

private System.Windows.Forms.ContextMenuStrip set_is_in_inventory;

在第一个版本中,您在 InitializeContextMenu() 中实例化了一个名为 set_is_in_inventory 的新变量,其类型为 ContextMenuStrip,正如评论者指出的那样,它可能应该是命名为 _setIsInInventory 以遵循 .NET 命名约定。无论如何。您实际上并没有在任何地方使用这个变量。它在方法之外没有作用域,也什么都不做。我想你想要的是设置 class 的 属性。要使 classes' set_is_in_inventory 属性 成为您刚刚实例化的那个,您需要做

private void InitializeContextMenu(){
{
    this.set_is_in_inventory = new System.Windows.Forms.ContextMenuStrip();
}

或可选,

set_is_in_inventory = new System.Windows.Forms.ContextMenuStrip();

这是 MSDN 示例中的第一行。在 MSDN 示例中,您可能也会感到困惑的是,class 似乎还有另一个名为 ContextMenuStrip 的 属性,它也在 第二行 。这也被设置为 set_is_in_inventory。有时 class 属性将它们的名称作为 class 的名称,就像这样(完全合法的语法):

public ClassA {
    public Class Class {get;set;}
}

要设置ClassA's属性Class,你只需

this.Class = new Class();

Class = new Class();

你可以看到这会让人感到困惑,所以很多人只是将 属性 命名为与 class 不同的名字,如下所示:

public ClassA{
    public Class MyClass {get;set;}
}

HTH.