我是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()方法可用?
提前致谢。
答案 0 :(得分:5)
您的两种方法是扩展方法,它们在调用时看起来像实例方法。它们可以静态调用,但是您需要提供实例作为第一个参数,并指定声明扩展方法的类,而不是该方法“扩展的类型“:
Extensions.getName(co);
当你将扩展方法称为“实例”方法时,它只是一个编译技巧。所以这段代码:
co.addName("test");
编译为完全相同的:
Extensions.addName(co, "test");
(顺便说一句,你最好尽快开始遵循正常的.NET naming conventions。越早养成这个习惯就越好。)