为什么可以通过类实例在C#中的静态方法中调用非静态方法

时间:2016-12-14 12:23:19

标签: c# .net oop

通常我们不能在静态方法中调用非静态方法。但是如果我们使用类实例,那么我们就可以做到。类实例如何使我们成为可能?

2 个答案:

答案 0 :(得分:8)

问题很简单:您尝试调用该方法的实例?应该假设什么样的本地字段?

对于实例方法,这很简单:当您调用SomeInstanceMethod()时,编译器会添加一个隐式this.,因此这些问题的答案是"当前一个" (在技术术语中,是arg0)的值。因此,当您键入SomeInstanceMethod()时,编译器会假定您的意思是this.SomeInstanceMethod()

对于静态方法,没有可以添加的隐式this。您仍然可以调用实例方法,但需要显式指定目标实例。 someObj.SomeInstanceMethod()可以正常使用。请注意,您还可以使用实例方法中的someObj.SomeInstanceMethod()在不同实例的上下文中调用该方法。

答案 1 :(得分:7)

  

通常我们不能在静态方法中调用非静态方法。

这是一个粗略的过度简化:我们不能通过提供单个方法名称来调用我们自己的类中的非静态方法,因为没有默认的"这个"宾语。当你写

SomeMethod(arg1, arg2);

在实例方法中,C#将其解释为

this.SomeMethod(arg1, arg2);

同样的技巧在静态方法中不起作用,因为静态方法无法访问"这个"。

  

但是如果我们使用类实例,那么我们可以做到以上几点。

那是因为一旦你提供了另一个对象,就没有必要寻找"这个"对象