在这段代码中,静态函数和非静态函数之间是否存在差异?
而且,除了静态函数属于对象而不属于实例之外,是否存在更多差异?
public class ClassName
{
public void f1(SomeObject n)
{
n.someProperty = 1;
}
public static void f1(ref SomeObject n)
{
n.someProperty = 1;
}
}
重复? 是的,所以看来。请注意,在另一个问题中,没有解决问题本身的答案。
答案 0 :(得分:5)
除了你已经提到的那些:不,没有区别。事实上,不会真正影响(或需要知道同一对象的实例状态)的函数应该是首选的静态函数(至少会减少每个实例的内存占用量)。对象)。
现在我想起来了,我认为它确实不会影响内存占用。所以看看看起来更好,"设计明智"
只是添加,如果一个方法(如上所述)不需要对象的实例,"设计方式",它应该更好,因为静态。如果有的话,因为你不必实例化一个对象来使用它。
答案 1 :(得分:-1)
为什么f1
与ClassName
相关联。您应该extend SomeObject
。
public static class SomeObjectExtensions
{
public static void f1(this SomeObject o) { o.SomeProperty = 1; }
}
然后您的代码可以执行:
var so = new SomeObject();
so.f1();
答案 2 :(得分:-1)
仅根据您在问题中发布的线条判断,您一定要使用 静态版本因为调用实例方法会导致性能损失:
1。)调用后面的实例方法涉及在评估中加载实例,这是“this”参数,这是避免的 调用静态方法。
2.。)调用实例方法编译为“Callvirt”IL操作码,该操作码对“this”首次传递的参数执行空检查 然后尝试解析调用运行时实际实例方法, 这适用于所有实例方法,不仅适用于虚拟方法 正如这个名字可能错误地暗示的那样。调用静态方法 另一只手将编译为“调用”IL操作码,它将只调用 方法。
3。)静态方法本质上是无状态的,这使得多线程设计更容易(如果它们使用外部共享静态字段)。