【问题标题】:Why does this code sample work as intended in VB.NET but not in C#?为什么此代码示例在 VB.NET 中按预期工作,但在 C# 中却没有?
【发布时间】:2013-09-20 04:14:06
【问题描述】:

我正在尝试在 VB 和 C# 中禁用 Form1

来自 Created 子表单、按钮单击或 w/e 的示例

  • VB.NET

    Me.Focus()
    Me.Enabled = True
    Form1.Enabled = False
    
  • C#

      //This is my attempt at a functional translation
      //if (_form1 == null)
      //        _form1 = new Form1();
      //    _form1.Enabled = False;
    
     //This is a literal translation
     // This Code will not disable form1
     this.Focus();
     this.Enabled = true;
     Form1.Enabled = false;
    

C# 代码不会像 VB.NET 代码那样从 form2 禁用 Form1

从这些 C# 参考资料中,我收集到上面注释的代码可以工作(我知道如何在 VB.net 中使用它):Ref1,Ref2,Ref3

我想知道的是

  • 为什么如此不同,为什么我不能像在 VB 中那样访问 Form1(来自 Form2)?
  • 还需要哪些其他步骤才能完全访问 Form1?

【问题讨论】:

  • 不同之处在于你的代码做不同的事情。如果您想要相同的行为,则让代码对两个版本执行相同的操作。
  • 如果键入 this.Focus(); this.Enabled = true; Form1.Enabled = false; 将无法访问表单,该怎么办
  • 你没有做对,这就是为什么你认为 C# 的控制力不如 VB。
  • 你确定你不只是想要像form2.ShowDialog();这样的东西吗?
  • @DavidHeffernan 我清理了一下。在完成所有 OP 的编辑之后,除了基本的语法/格式之外,我没有看到太多需要修复的内容。基本问题是合理的。

标签: c# vb.net winforms


【解决方案1】:

您的 VB 代码正在利用默认表单实例的功能。

(在 VB.NET 中)在幕后,每个 Form 类都被赋予了一个与表单本身相同类型的静态变量,当创建一个新表单时,它会将自己设置为该静态变量的值。该变量也是该类型的默认静态属性(VB 具有 C# 没有的另一个功能),这就是您可以使用类型名称直接访问此属性的原因。您可以查看this related question 了解为什么此功能仍然存在于 VB 中的一些历史记录,尽管事实上它不再具有严格意义。

有很多方法可以在 C# 中复制这种行为,自己创建静态属性并手动设置/清除它,但我强烈不鼓励你这样做。这个一般概念是相当糟糕的实践,这就是为什么在 C# 中故意省略了这个特性。

即使您使用的某些表单碰巧只存在一次,从概念上讲也不只是表单的一个实例。

更优选的做法是在您的第二个表单中创建一个第一个表单订阅的事件。 (或使用现有事件,如果合适的话)。在这种情况下,您希望父表单将 Enabled 设置为 false,只要子表单将其启用为 true,您可以通过使用现有事件来实现。

当您在父表单中创建子表单时,只需使用EnableChanged 事件根据子表单的操作更改父表单的属性:

Form2 child = new Form2();
child.EnabledChanged += (s, args) => Enabled = !child.Enabled;

那么子窗体永远不需要知道它的父窗体。从设计的角度来看,这太棒了。您可以减少耦合并提高模块化。子表单的开发者不需要知道任何关于父表单或它需要做什么的事情。子表单只需要知道任何人可能想要如何使用它并提供所需的功能。

【讨论】:

  • 感谢Servy,非常感谢您的回答和问题编辑。希望这也可以帮助其他人。
  • 干得好。我很高兴看到这一切都解决了。多么可怕的功能啊!
  • @DavidHeffernan 是的。它削弱了几代程序员......今天它造成的损害要小一些,但正如这个问题所示,仍然很多。
  • @Servy - 这和 Option Strict 默认为 Off 会造成很大的损害!
猜你喜欢
  • 1970-01-01
  • 2016-08-21
  • 1970-01-01
  • 2018-07-20
  • 1970-01-01
  • 2020-11-10
  • 2021-12-11
  • 1970-01-01
  • 2019-12-26
相关资源
最近更新 更多