gpt4 book ai didi

c# - 无法在 C# 中访问类的非共享成员,但在 VB 中可以吗?

转载 作者:太空宇宙 更新时间:2023-11-03 17:28:26 24 4
gpt4 key购买 nike

刚开始学C#,以前是VB程序员。

在 VB.NET 中,可以访问表单类方法,即使此方法未声明为共享。在下面的代码中,我没有遇到编译器错误,在 ClassFoo 中调用方法 Foo 工作正常。

Public Class Form1
Public Sub Foo()
MsgBox("Test")
End Sub
End Class

Public Class ClassFoo
Sub Foo()
Form1.Foo()
End Sub
End Class

然后,我尝试将相同的代码移植到 C#,但出现错误:
“非静态字段和 bla bla bla 需要对象引用”。

为什么我可以访问一个在 VB 中不共享而在 C# 中不能共享的方法?

最佳答案

这是从 VB6 继承的一个相当可怕的功能,VB6 是一种允许这种构造的语言。在纯 OOP 语言中是不允许的,引用对象的成员需要对象名称,而不是类型名称。

VB.NET 团队在 VB.NET 语言中遇到了一些麻烦才使它工作。该语句中的“Form1”实际上是一个对象引用,由编译器自动生成。顺便说一句,在线程中使用该名称时会出现严重错误。

但这在 C# 语言中行不通,您必须提供对象引用。您将不得不重构代码,以便 ClassFoo 对象具有该引用。像这样:

public class Form1 {
ClassFoo fooObj;
public Form1() {
fooObj = new ClassFoo(this);
}
public void Foo() {
MessageBox.Show("un-fooed");
}
}

public class ClassFoo {
Form1 mainForm;
public ClassFoo(Form1 main) {
mainForm = main;
}
public void Foo() {
mainForm.Foo();
}
}

这可能会在您学习 C# 时造成一些痛苦。 Q&D 解决方法是使用 Application.OpenForms。如果您喜欢咬紧牙关,请避免使用它。

关于c# - 无法在 C# 中访问类的非共享成员,但在 VB 中可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3104703/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com