编程语言
首页 > 编程语言> > c#-非静态字段,方法或属性需要对象引用

c#-非静态字段,方法或属性需要对象引用

作者:互联网

我知道人们以前曾问过这个问题,但这种情况过于具体,我对基本面感到困惑.

我有C#程序的两个基本版本,一个有效,一个无效.如果有人可以解释为什么会出现错误,我会喜欢的.第二个程序中的非静态字段,方法或属性需要对象引用.

作品:

namespace Experiments
{
    class Test
    {
        public string myTest = "Gobbledigook";

        public void Print()
        {
            Console.Write(myTest);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Test newTest = new Test();
            newTest.Print();
            while (true)
                ;
        }
    }
}

不起作用:

namespace Experiments
{
    class Test
    {
        public string myTest = "Gobbledigook";

        public void Print()
        {
            Console.Write(myTest);
        }
    }

    class Program
    {
        public Test newTest = new Test();

        static void Main(string[] args)
        {
            newTest.Print();
            while (true)
                ;
        }
    }
}

当我尝试在第二个程序中对Test()类的文本进行Print()时,它给我带来了错误:非静态字段,方法或属性需要对象引用,而我不明白为什么.我可以看到它与声明Test()类实例的位置有关,但是我不记得在C中发生过类似的事情,因此它使我感到困惑.

这是怎么回事?

解决方法:

这不是因为类的定义,而是关于关键字static的用法.

Test类的newTest对象是Program类的公共成员,而main是program类内部的静态函数.错误消息中巧妙地提到了该对象.非静态方法需要对象引用.因此,您需要将newTest对象声明为静态对象,以便以诸如main之类的静态方法访问它们.

像这样

 public static Test newTest = new Test();

补充说明

考虑到您在Test类中定义了方法Print as static,如下所示:

 public static void Print()
 {
    Console.Write(myTest);
 }

然后,您不能像当前使用的那样调用该方法(newTest.Print();).而是必须使用Test.Print();,因为不能通过实例引用静态成员.而是通过类型名称引用它.例如,考虑以下课程

标签:declaration,initialization,non-static,c,class
来源: https://codeday.me/bug/20191026/1937701.html