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

RHa*_*uda 1 c#

我刚刚开始学习C#,曾经是一名VB程序员.

在VB.NET中,即使此方法未声明为共享,也可以访问表单类方法.在下面的代码,我不`吨得到编译器错误,并调用方法美孚ClassFoo工作正常.

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

Public Class ClassFoo
    Sub Foo()
        Form1.Foo()
    End Sub
End Class
Run Code Online (Sandbox Code Playgroud)

然后,我尝试将相同的代码移植到C#,但是我收到一个错误:
"非静态字段和bla bla bla需要对象引用".

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

Han*_*ant 6

这是从VB6继承的一个相当可怕的特性,VB6是一种允许这种结构的语言.在纯OOP语言中不允许使用它,引用对象的成员需要对象名称而不是类型名称.

VB.NET团队在使用VB.NET语言时遇到了一些麻烦.此语句中的"Form1"实际上是一个对象引用,它由编译器自动生成.在线程btw中使用该名称时出现可怕的错误.

但是这不会用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();
    }
}
Run Code Online (Sandbox Code Playgroud)

在学习C#时,这可能会导致一些痛苦.这方面的Q&D解决方法是使用Application.OpenForms.如果您喜欢使用子弹,请避免使用它.