【发布时间】:2011-12-24 19:18:17
【问题描述】:
这个问题是在我们今天团队讨论后提出的。
我并不是 100% 熟悉 CLR 如何从程序集中实际加载类的代码,但是我认为静态方法存储在一个单独的数据结构中,而不是类的所有实例方法。
那么为什么一个类不能同时声明具有相同签名的静态方法和实例方法呢?
整个讨论都是理论上的,并不是说这是否是一个好习惯,但如果有任何明显的原因不允许这样做,我仍然想更好地理解。
【问题讨论】:
这个问题是在我们今天团队讨论后提出的。
我并不是 100% 熟悉 CLR 如何从程序集中实际加载类的代码,但是我认为静态方法存储在一个单独的数据结构中,而不是类的所有实例方法。
那么为什么一个类不能同时声明具有相同签名的静态方法和实例方法呢?
整个讨论都是理论上的,并不是说这是否是一个好习惯,但如果有任何明显的原因不允许这样做,我仍然想更好地理解。
【问题讨论】:
在OOP中,类的静态对象或成员可以直接从类中访问,而非静态成员只能从其所属的实例中访问。
C# 的方法遵循类似的原则。静态方法可以直接从类中访问,而非静态方法(或我喜欢称之为实例方法)必须从实例中访问。这就是为什么需要对实例方法进行实例化,而对于静态方法则不需要,而且不切实际(见下文)。
在 OOP 中,静态变量用于无法由实例变量存储的值。示例:假设您想计算一个类的实例数量?您将如何将其存储在单个实例中?
这些方法使用类似的原理。它们应该用于在类的实例中执行不切实际的过程。我倾向于将它们用于广泛的过程(不是技术术语),即那些不需要我实例化对象的过程。例如,添加两个参数。 (这种用法可能正确也可能不正确,但我相信它是)
但是,如果您想添加一个对象的两个属性,则该方法不能是静态的,因为您很快就会意识到,静态方法不能访问类中的实例方法或变量。当然这是有道理的,因为除非被告知,否则静态方法不会知道从类的哪个实例获取这些,因为它不是实例本身的一部分)
【讨论】: