【问题标题】:C# static class why use? [duplicate]C#静态类为什么要用? [复制]
【发布时间】:2011-12-17 12:37:42
【问题描述】:

可能重复:
When to Use Static Classes in C#

我经常将我的类设置为静态,但我不确定何时使用静态,或者使用与不使用它有什么不同。

谁能解释一下?

【问题讨论】:

  • 静态类/方法对于实现单例模式和工厂模式很有用...
  • @Yahia:带有静态类的单例模式? I don't think so.
  • @BoltClock 如果你仔细阅读然后我写了“静态类/方法”,我很确定静态方法在实现单例模式时很有用......

标签: c# class static


【解决方案1】:

将类设为静态只会阻止人们尝试创建它的实例。如果您的所有类都是静态成员,那么最好将类本身设为静态。

【讨论】:

  • 如果我们将所有成员都设为静态,为什么将类设为静态是一个好习惯?将类本身设为静态有什么好处?
  • 它将阻止人们尝试实例化它
  • 但是为了这个目的,你可以声明一个私有构造函数并创建类 Singleton。据我所知,静态类将始终保留在内存中,从而产生开销,但普通的单例类不会。
  • @DylanSmith 以及为什么阻止人们尝试实例化它是一个好习惯,真正的问题是为什么使用静态方法或静态类好???
  • 一般来说,出于测试能力的目的,我会尽量避免使用静态方法。但是如果你有一个只包含静态方法的类,那么该类的消费者不应该实例化它,因为它没有意义。将其设为静态类将允许编译器告诉开发人员他们正在做他们不应该做的事情。
【解决方案2】:

如果一个类被声明为静态,那么变量和方法需要被声明为静态。

一个类可以声明为静态的,表明它只包含静态成员。无法使用 new 关键字创建静态类的实例。加载包含类的程序或命名空间时,.NET Framework 公共语言运行时 (CLR) 会自动加载静态类。

使用静态类来包含与特定对象无关的方法。例如,创建一组不作用于实例数据并且不与代码中的特定对象关联的方法是一个常见的要求。您可以使用静态类来保存这些方法。

->静态类的主要特点是:

  • 它们只包含静态成员。
  • 它们不能被实例化。
  • 它们是密封的。
  • 它们不能包含实例构造函数或简单的构造函数,因为我们知道它们与对象相关联并在创建对象时对数据进行操作。

示例

static class CollegeRegistration
{
  //All static member variables
   static int nCollegeId; //College Id will be same for all the students studying
   static string sCollegeName; //Name will be same
   static string sColegeAddress; //Address of the college will also same

    //Member functions
   public static int GetCollegeId()
   {
     nCollegeId = 100;
     return (nCollegeID);
   }
    //similarly implementation of others also.
} //class end


public class student
{
    int nRollNo;
    string sName;

    public GetRollNo()
    {
       nRollNo += 1;
       return (nRollNo);
    }
    //similarly ....
    public static void Main()
   {
     //Not required.
     //CollegeRegistration objCollReg= new CollegeRegistration();

     //<ClassName>.<MethodName>
     int cid= CollegeRegistration.GetCollegeId();
    string sname= CollegeRegistration.GetCollegeName();


   } //Main end
}

【讨论】:

  • 强制强制强制强制强制强制
  • 我知道这个答案是很久以前的,但静态类实际上可以有静态构造函数。仅供参考。如果您选择参与,它们将用于值的初始实例化。
【解决方案3】:

静态类在某些情况下很有用,但也有可能滥用和/或过度使用它们,就像大多数语言功能一样。

正如 Dylan Smith 已经提到的,使用静态类最明显的情况是,如果你有一个只有静态方法的类。允许开发人员实例化这样的类是没有意义的。

需要注意的是,过多的静态方法本身可能表明您的设计策略存在缺陷。我发现当您创建一个静态函数时,最好问问自己——它是否更适合作为 a) 实例方法或 b) 接口的扩展方法。这里的想法是对象行为通常与对象状态相关联,这意味着行为应该属于对象。通过使用静态函数,您暗示该行为不应属于任何特定对象。

过度使用静态函数会阻碍多态和接口驱动的设计——它们不能在派生类中被覆盖,也不能附加到接口上。通常最好通过扩展方法将您的“帮助”功能绑定到接口,以便接口的所有实例都可以访问该共享的“帮助”功能。

在我看来,静态函数绝对有用的一种情况是创建一个 .Create() 或 .New() 方法来实现对象创建的逻辑,例如当您想要代理正在创建的对象时,

public class Foo
{
    public static Foo New(string fooString)
    {
        ProxyGenerator generator = new ProxyGenerator();

        return (Foo)generator.CreateClassProxy
             (typeof(Foo), new object[] { fooString }, new Interceptor()); 
    }

这可以与代理框架(如 Castle Dynamic Proxy)一起使用,您希望根据分配给其方法的某些属性来拦截/注入功能到对象中。总体思路是您需要一个特殊的构造函数,因为从技术上讲,您正在创建具有特殊附加功能的原始实例的副本。

【讨论】:

    猜你喜欢
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 2020-02-02
    • 2012-12-28
    • 1970-01-01
    • 2013-03-05
    • 2011-08-13
    • 1970-01-01
    相关资源
    最近更新 更多