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