静态/实例方法和扩展问题

时间:2014-08-08 21:06:59

标签: c# oop

我是C#的新手,我开始研究一个需要在C#中添加一个类的方法的项目。我发现自己正在检查静态方法和实例方法之间的差异,我无法在示例项目中解释以下内容。

My Core对象:

namespace ExtendingObjects
{
    public class MyCoreObject
    {
        public String name;
        public String returnName()
        {
            return name;
        }
    }
}

我尝试扩展对象:

namespace ExtendingObjects
{
    public static class Extensions
    {
        public static void addName(this MyCoreObject mco, String str)
        {
            mco.name=str;
        }

        public static String getName(this MyCoreObject mco)
        {
            return "test";
        }
    }
}

致电计划:

namespace ExtendingObjects
{
    class Program
    {
        static void Main(string[] args)
        {
            MyCoreObject co = new MyCoreObject();
            co.addName("test");
            //Static method seems to work with instance?
            String n = co.returnName();
            Console.WriteLine("The name is " + n);
            Console.ReadLine();
            //Does not work
            //Static method from a type
            //String n2 = MyCoreObject.getName()
        }
    }
}

我的理解是,静态项目与类和实例项一起保留,每个MSDN Static and Instance Members实例。但是,我似乎能够通过上面的实例访问静态方法,但无法通过类型访问静态方法。

为什么co.returnName()工作而不是MyCoreObject.getName()?根据我的阅读,我认为他们会反过来。如何在不首先实例化对象的情况下使getName()方法可用?

提前致谢。

1 个答案:

答案 0 :(得分:5)

您的两种方法是扩展方法,它们在调用时看起来像实例方法。它们可以静态调用,但是您需要提供实例作为第一个参数,并指定声明扩展方法的类,而不是该方法“扩展的类型“:

Extensions.getName(co);

当你将扩展方法称为“实例”方法时,它只是一个编译技巧。所以这段代码:

co.addName("test");

编译为完全相同的:

Extensions.addName(co, "test");

(顺便说一句,你最好尽快开始遵循正常的.NET naming conventions。越早养成这个习惯就越好。)