0

我在 VS2010 上有这个简单的示例:

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            AbsClass absClass = new ConClass();
            // I have tried this also and the error is different:
            // ConClass absClass = new ConClass();
            absClass.Id = "first";
            Console.WriteLine(absClass.Id);
            MyMethod(ref absClass);  // <<- ERROR.
            Console.WriteLine(absClass.Id);
            Console.ReadKey();
        }

        public void MyMethod(ref AbsClass a)
        {
            a.Id = "new";
        }
    }

    public abstract class AbsClass
    {
        public string Id { get; set; }
    }

    public class ConClass : AbsClass { }
}

我想知道为什么这不能正确构建。

4

2 回答 2

4

你需要使你的MyMethod静态:

    public static void MyMethod(ref AbsClass a)
    {
        a.Id = "new";
    }

问题不是抽象类,“问题”是静态Main方法。静态方法没有实例,因此不能调用实例方法。

msdn 关于静态类和静态成员

于 2011-03-30T23:00:50.360 回答
0

您要么需要使您的MyMethod方法静态:

public static MyMethod(ref AbsClass a)
{
    a.Id = "new";
}

或者最好创建一个Program类的实例,并MyMethod从该实例调用:

Program p = new Program();
p.MyMethod(ref abs);

第一种方法有效的原因是该Main方法被标记为静态,并且不绑定到Program类的实例。.NET Framework CLR 在您的程序集中搜索名为的静态方法Main,该方法接受一个 数组String,并将该函数作为入口点。您会注意到许多教程甚至 MSDN 代码示例都Program使用 static 关键字标记类,当类中的所有方法仅包含静态方法时,这被认为是最佳实践。

第二种方法有效的原因,以及为什么首选这种方法,是因为您定义MyMethod为一个实例方法。基本上,您需要一个对象的实例才能执行实例方法;new关键字创建指定类型的实例。静态方法可以在没有对象实例的情况下调用,但也不能访问任何非静态实例成员(属性、私有/公共变量等)。通常,您希望避免使用静态方法和类,除非您必须实现实用程序类、利用扩展方法或提供辅助方法。

于 2011-03-30T23:20:21.210 回答