静态成员优于实例成员有什么优势?
答案 0 :(得分:6)
类通常代表某些东西的蓝图,例如我们可以定义一个这样的类:
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
通过将其设为实例类,我们可以实例化多个“人员”,每个人都包含不同的值
var person1 = new Person { FirstName = 'Fred', LastName = 'Bloggs' };
var person2 = new Person { FirstName = 'John', LastName = 'Smith' };
因为不是每个人都有相同的价值观,所以人是静止的是没有意义的。
但是,让我们再举一个例子 - 我们希望在整个应用程序中维护一个计数器值:
public static class Counter
{
public static int Count { get; set; }
}
在这种情况下,使计数器静态是有意义的,这样在内存中只有一个副本,所有引用指向同一个东西。
答案 1 :(得分:4)
实例方法可以使用实例状态和静态(即:全局)状态,而静态方法只能使用静态(即:静态变量)。
因此,如果您作为调用者调用静态方法,则确定它不会修改实例状态。
这也意味着您不确定它是否会修改静态。如果是,那么它不是“线程安全的”,这意味着2个方法不能在同一时间调用这个静态方法(使用2个CPU,但使用相同的内存)。
当然,任何静态方法都可以用实例方法替换,但是所有对此方法的调用都需要先创建一个对象。创建对象使用CPU和内存(它为所有实例变量分配一个块,如果有的话),并在代码中添加1行,使其可读性降低。 为了缓解这个问题,你可以使用Singleton实例,它具有更灵活的优点,因为你可以通过仅在一个地方更改它来切换所使用的Singleton类。 Singleton实例可以存储为公共静态变量,也可以存储在IOC容器中(如unity)。使用IOC容器的优点是,您将能够与外部库共享单例实例,并且不需要静态变量(除了IOC容器本身的单例实例)。
希望它有所帮助。
答案 2 :(得分:2)
创建对象,访问类的行为
是最重要的
如果它是一个类的行为并且对该类有影响,那么它首先不应该是静态的。
只有那些字段应该是静态的,对于像connection string
而只有那些方法应该是静态的,不会对类的行为产生影响。就像你已经指出自己计算2个变量之和。
答案 3 :(得分:2)
为什么我需要静态函数,而不是成员函数
即使您的类没有任何状态,请尝试使用静态方法覆盖行为:
public class Foo
{
public virtual Bar() {}
}
尝试使用静态方法实现接口和注入接口实现:
public interface IPlugin
{
void DoSomething();
}
最后,但并非最不重要。使静态方法成为线程安全的最佳实践。你真的想让你编写线程安全的每个方法吗?