假如说我们创建了类A和类B,在B类的方法中想直接用类A点出A类中的方法的话,那必须A类中的方法是静态方法是吧
    class Program
    {
        void Main()
        {
            A.method();//可以直接调用,method2必须实例化
        }
    }
    class A
    {
        public static void method()
        {
            Console.WriteLine("hi");
        }        public void method2()
        {
            Console.WriteLine("hello");
        }
    }问题来了。
第一,VB.NET环境下的时候。假如创建Form1和Form2两个窗体(Form我认为同样也是一个类),我在Form1中写了个方法method或者是属性,没有加上static,我在Form2中直接调用Form1.method(),这么写居然也是能通过的,并不需要实例化就可以访问到method方法
第二,C#环境下。同样上面的写法。很自然的就访问不到了。汗~~这是为什么呢???  我的理解
是不是为了能够使VB.NET和VB6.0的一些写法要一致,才这样的?
貌似vs2005以前的版本(vs2003什么的)第一种情况是通不过的,很多vb6.0转vb.net的人都不适应?为了和谐...2005就适用了-_-!
我太笨,不知道是不是这原因哦,请大虾帮助偶~~5个裤衩水了-_-!(不耻下问撒)

解决方案 »

  1.   

    没有用过vb.net,但是如果是引用类里面的非静态成员肯定要实例化该类的,这是面向对象的一些基本东西,你应该仔细测试你写的代码。
      

  2.   

    我也这么想哎,vb6.0又不是面向对象的vb.net才是啊。  偶也迷糊呢,估计是和谐~
    现在和谐很强大哦~~
      

  3.   

    VB实际上自己检查是否实例了?如果有没有就new一个?
      

  4.   

    是不是C#把类都封装了。VB的貌似是窗体直接就能点出声明为PUBLIC的。我是这样想的。呵呵
      

  5.   

    VB.NET和VB6.0 差别还是很大的! 今天在改一个VB6.0的程序!
      

  6.   

    楼主遇见奇迹了?
    以下代码无法编译通过
    Module Module1
        Public Class Class1
            Public Sub Foo()
            End Sub
        End Class    Public Class Class2
            Public Sub Foo2()
                Class1.Foo()
            End Sub
        End Class
        Sub Main()    End SubEnd Module
      

  7.   

    补充:
    假如VB.net创建常规的类,就像类A和类B的话是和C#一样的  不能直接访问的
    但是在VB.net的Form类中就可以,C#的Form类内是正常的不能访问的
    为什么呢~~~  
      

  8.   

    你是不是碰巧实例化了一个Form1,名字就叫Form1?
      

  9.   


    是的,我说的是在Form窗体类中的问题,常规的类中这么写是没问题的。
    看我13楼的补充~~~~
    呵呵,没说明白。补充下~~~-_-!
      

  10.   

    非静态的成员方法不是要实例化的吗???
    这是OOP啊..
      

  11.   

    右键点击你的方法名,转自定义,就知道是哪个方法了.如上面的所说,可能刚好有个变量名是form1
      

  12.   

    搞定
    对于WinForm程序
    编译器自动生成了一个MyForms类,MS为了保持用户习惯,可谓是XXXXX。生成的类如下:[MyGroupCollection("System.Windows.Forms.Form", "Create__Instance__", "Dispose__Instance__", "My.MyProject.Forms"), EditorBrowsable(EditorBrowsableState.Never)]
    internal sealed class MyForms
    {
        // Fields
        public Form1 m_Form1;
        public Form2 m_Form2;
        [ThreadStatic]
        private static Hashtable m_FormBeingCreated;    // Methods
        [EditorBrowsable(EditorBrowsableState.Never), DebuggerHidden]
        public MyForms();
        [DebuggerHidden]
        private static T Create__Instance__<T>(T Instance) where T: Form, new();
        [DebuggerHidden]
        private void Dispose__Instance__<T>(ref T instance) where T: Form;
        [EditorBrowsable(EditorBrowsableState.Never)]
        public override bool Equals(object o);
        [EditorBrowsable(EditorBrowsableState.Never)]
        public override int GetHashCode();
        [EditorBrowsable(EditorBrowsableState.Never)]
        internal Type GetType();
        [EditorBrowsable(EditorBrowsableState.Never)]
        public override string ToString();    // Properties
        public Form1 Form1 { [DebuggerNonUserCode] get; [DebuggerNonUserCode] set; }
        public Form2 Form2 { [DebuggerNonUserCode] get; [DebuggerNonUserCode] set; }
    }
      

  13.   

    大家可以编译后,用reflector 看一下编译结果........
      

  14.   

    顶 cppfaq,看来微软真是和谐啊
      

  15.   

    不熟悉VB.net不过印象中VB中静态不是static,好像是shared吧?
      

  16.   

    真没有,新开的工程测试的!
    Form1.vb
    Public Class Form1    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Form2.Method()
        End Sub
    End ClassForm2.vb
    Public Class Form2
        Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load    End Sub    Public Sub Method()
            Console.WriteLine("hi")
        End Sub
    End Class测试通过~~~
      

  17.   

    26楼的程序在 Visual Studio 2008 下编译:error BC30469: 对非共享成员的引用要求对象引用。        Form2.Method()
            ~~~~~~~~~~~~
      

  18.   

    关键在于你 new 了没有,如果没有的话,只有静态成员才能使用
      

  19.   

    public static void method()
            {
                Console.WriteLine("hi");
            }
    你的这个方法 是个静态类 可以直接 类名.方法名 调用
    public void method2()
            {
                Console.WriteLine("hello");
            }
    是非静态 需要实例化后  再用对象名.方法名 调用
      

  20.   

    顺便提1句   这个是C#的语法   至于VB.NET 暂时没接触过 
      

  21.   


    VS版本<2005  没被和谐
    = 2005       和谐
    >2005        又不和谐总结完毕
      

  22.   

    空军大哥  你那个VS2008测试的是不是VB.NET环境测试的哦~~  我只有2005版本的  
    谁帮我确认下~ 虽然没意义,了解下