C# - 静态成员vs实例成员

时间:2013-08-23 10:11:47

标签: c#

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

4 个答案:

答案 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();
}

最后,但并非最不重要。使静态方法成为线程安全的最佳实践。你真的想让你编写线程安全的每个方法吗?