为什么我们不能通过.net中的对象访问静态方法

时间:2019-01-10 10:01:06

标签: c#

具有以下代码:

WHERE SHOWTIMES.ID = 1 OR SHOWTIMES.ID IS NULL;

我需要通过基类而不是通过实例访问静态方法。

但是,让用户通过实例访问它的缺点是什么?在我看来,这将有助于提高可读性。

6 个答案:

答案 0 :(得分:6)

您不能从类实例中调用静态方法,因为所有静态字段和方法都与该类型相关联,而不是与该类型的实例相关联。

为了更深入地了解静态类,建议您阅读this

答案 1 :(得分:0)

或者,您可以在基类或子类上创建静态方法作为扩展方法。然后,您可以尝试从对象实例直接调用它。

答案 2 :(得分:0)

使用instance.DoSomething();表示您正在调用实例的方法(由于它是静态类成员,与实例本身无关,因此当然不正确)。因此,它可能只会导致混乱。

通过使用MyClass.DoSomething();,很容易理解它实际上是您正在调用的类的成员(而不是实例的成员)。如果遵循标准的命名约定(类名以大写字母开头),也许会更清楚。

要进一步了解静态成员,请参见Microsoft docs

答案 3 :(得分:0)

对于语言决定中的每个问题,您都必须考虑其使用以及由您的请求引起的潜在危害。虽然在特定情况下可以提高您(个人)的可读性,但对于没有源代码的代码阅读者来说,却增加了很多困惑。此外,它将假定编译器能够确定成员是否确实在实例上执行某项操作。因此,编译器将具有更为复杂的逻辑,以实现可以通过static关键字轻松表明自己的功能。

实际上,实例方法可以对实例进行某些操作,它不必 modifiy 其状态,它也可以使用声明并处理一些操作。在没有实例语义的实例级别上提供某些东西似乎很违反直觉,并且破坏了至少令人惊讶的原则-至少对我而言。如果某个实例上有一个成员被调用,则应该对该实例执行某项​​操作。不管是不是,实际上都是一个实现细节,客户根本不必理会。

答案 4 :(得分:0)

我想你在问什么

  

调用静态方法时,为什么必须指定   定义方法,并且在调用实例方法时,为什么我们必须   指定一个引用该类对象的实例。

要回答这个问题,我们必须了解CLR如何在后台管理事物。 让我们尝试了解创建新实例时会发生什么:

当我们“ new”创建一个类的实例时,CLR在managed heap中创建一个对象,该对象在堆上(除其他事项外)还包含保存所有该类定义的实例数据字段以及任何基类(例如Object类)定义的任何实例字段。 这意味着实例字段与我们在代码中通过 newing 刚创建的类的实例相关联。

现在,当调用静态方法时,JIT编译器会找到与定义静态方法的类型相对应的类对象。请注意,此处未使用实例(对象)。然后,JIT编译器在类对象的方法表中找到引用被调用方法的条目,对方法(如果是第一次调用)进行JIT,然后调用JITted代码。 请注意,CLR在发现实例和静态方法方面的区别。

答案 5 :(得分:-1)

我认为这是文档中的关键行:

  

仅存在一个静态成员的副本,无论有多少个静态成员   该类的实例已创建。

鉴于上述情况,仅允许通过类访问才有意义。