2

静态成员比实例成员有什么优势?

4

4 回答 4

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' };

Person 是静态的没有意义,因为不是每个人都有相同的价值观。

但是,让我们再举一个例子——我们想在整个应用程序中维护一个计数器值:

public static class Counter
{
    public static int Count { get; set; }
}

在这种情况下,将计数器设为静态是有意义的,这样内存中只有一个副本,并且所有引用都指向同一事物。

于 2013-08-23T10:17:25.670 回答
5

实例方法既可以使用实例状态也可以使用静态(即:全局)状态,而静态方法只能使用静态(即:静态变量)。

因此,如果您作为调用者调用静态方法,则可以确定它不会修改实例状态。

这也意味着您不确定它不会修改静态状态。如果是这样,那么它就不是“线程安全的”,这意味着 2 个方法不能同时调用这个静态方法(使用 2 个 CPU,但使用相同的内存)。

当然,任何静态方法都可以用实例方法代替,但是所有对该方法的调用都需要先创建一个对象。创建对象使用 CPU 和内存(它为所有实例变量分配一个块,如果有的话),并在代码中添加 1 行,使其可读性降低。为了缓解这种情况,您可以使用 Singleton 实例,它的优点是更灵活,因为您可以通过仅在一个地方更改它来切换使用的 Singleton 类。单例实例要么存储为公共静态变量,要么存储在 IOC 容器中(如unity)。使用 IOC 容器的优点是您将能够与外部库共享单例实例,并且不需要静态变量(除了 IOC 容器本身的单例实例)。

希望能帮助到你。

于 2013-08-23T10:26:46.350 回答
2

为什么我需要一个静态函数,而不是成员函数

即使您的类没有任何状态,请尝试使用静态方法覆盖行为:

public class Foo
{
   public virtual Bar() {}
}

尝试使用静态方法实现接口并注入接口实现:

public interface IPlugin
{
    void DoSomething();
}

最后但同样重要的是。使静态方法线程安全是最佳实践。你真的想让你编写的每个方法都是线程安全的吗?

于 2013-08-23T10:27:19.333 回答
2

创建对象以访问类的行为有什么大不了的

如果它是一个类的行为并且对类有影响,那么它首先不应该是静态的。

只有那些字段应该是静态的,对于所有实例化的对象应该保持不变,例如connection string

而只有那些对类的行为没有影响的方法应该是静态的。就像您指出自己计算两个变量的总和一样。

于 2013-08-23T10:18:59.923 回答