【问题标题】:Are these objects functionally equal?这些对象在功能上是否相同?
【发布时间】:2023-03-15 04:10:02
【问题描述】:

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

我认为它的工作方式:

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;

【问题讨论】:

  • MSDN 将其分配给表单以便它实际出现,您所要做的就是创建对象。或许您可以解释为什么您认为您的方法可行,我们可以回答更根本的误解?
  • 顺便说一句,现在是熟悉 .NET 命名约定并开始遵循它们的好时机。
  • 第一个版本很奇怪。您有一个同名的本地和私有字段。您从不使用(AFAICT)私有字段。这个名字是巧合。您声明了两个不同的引用,它们不是同一个引用。还有 JS 关于命名约定的说法。 _setIsInInventory 是约定。
  • @BradleyDotNET :我认为最后一条语句是通知编译器存在这样的项目,而包装函数实际上创建了它。在第二个示例中,似乎将项目分配给了一个类型。 (我刚学过C,所以我的词汇量可能不够)

标签: c# initialization declaration assign


【解决方案1】:

在第一个版本中,您在 InitializeContextMenu() 中实例化了一个名为 set_is_in_inventory 的新变量,其类型为 ContextMenuStrip,正如评论者指出的那样,它可能应该命名为 _setIsInInventory 以跟随。 NET 命名约定。无论如何。您实际上并未在任何地方使用此变量。它没有方法之外的范围,它什么也不做。我认为你想要的是设置类的 property。要使类的 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 示例中,您可能也会感到困惑的是,该类似乎还有另一个名为 ContextMenuStrip 的属性,该属性也在 第二行 中设置。这也被设置为set_is_in_inventory。有时类属性的名称作为类的名称,就像这样(完全合法的语法):

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

要设置ClassA's 属性 Class,你就这样做

this.Class = new Class();

Class = new Class();

您可以看到这是多么令人困惑,所以很多人只是将属性命名为与类名不同,如下所示:

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

HTH。

【讨论】:

  • 我的荣幸。如果它回答了您的问题,请接受。
猜你喜欢
  • 2019-06-05
  • 2019-09-27
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-01
  • 2011-01-29
  • 1970-01-01
相关资源
最近更新 更多