C#关于static类

来源:互联网 发布:网络上开火车啥意思 编辑:程序博客网 时间:2024/04/29 12:22

原文转载:“http://blog.csdn.net/eclipseluo/article/details/4822148”


C#语言的另一个特性是可以将一个类声明为static类。static类中只能包含static成员(使用该类创建的所有成员将共享这些成员的同一个副本)。静态类纯粹作为工具方法和字段的一个容器来使用。static类中不能包含任何实例数据或方法。另外,使用new操作符来创建static类的一个对象是没有意义的。如果坚持要这样做,编译器会报错。如果需要执行任何初始化,那么static类可以包含一个默认的构造函数,前提是该构造函数也被声明为static。其他任何类型的构造函数都是非法的,编译器会报错。


Static   函数在使用时不用实例化它所在的类,直接用就得了。就象Convert.ToInt32()等这些函数。   
不用Static的函数,就必须实例化它所在的类进行使用。(完)

 

比较C#的静态常量(const)和动态常量(static和readonly)

C#拥有两种不同的常量:静态常量(compile-time constants)和动态常量(runtime constants)。它们有不同的特性,错误的使用不仅会损失效率,还可能造成错误。相比之下,静态常量在速度上会稍稍快一些,但是灵活性却比动态常量差很多。

//静态常量(隐式是静态的)
public const int compiletimeConstant = 1;
//动态常量
public static readonly runtimeConstant = 1;

      静态常量在编译时会将其替换为所对应的值,也就是说下面这2句话通过编译器编译后产生的IL是一样的。

//通过编译后二者会被翻译成相同的中间语言
int myNum = compiletimeConstant;
int myNum = 1;

      动态常量的值是在运行时获得的。IL中将其标为只读常量,而不是用常量的值代替。

      静态常量只能被声明为简单的数据类型(内建的int和浮点型)、枚举或字符串。下面的程序段是通不过编译的。你不能用new关键字初始化一个静态常量,即便是对一个值类型来说。

//这样是错误的
public const DateTime myDateTime = new DateTime(2006,9,1,0,0,0);
//这样是可以的
public static readonly DateTime myDateTime = new DateTime(2006,9,1,0,0,0);

      只读数据也是常量的一种,它们不能在构造器初始化之后被修改。但是它同静态常量不同,它的值是在运行时才被指派的,因此就会获得更大的灵活性。动态常量可以是任意的数据类型。

      二者最大的差别在于:静态常量在编译时会将其换为对应的值,这就意味着对于不同的程序集来说,当你改变静态常量的时候需要将其重新编译,否则常量的值不会发生变化,可能引发潜在的问题,而动态常量就不会有这种情况。

     用const定义的常量(隐式是静态的),需要像访问静态成员那样去访问const定义的常量,而用对象的成员方式去访问会出编译错误。 声明的同时要设置常量值。
     从另一方面来说,如果你的确要声明一些从不改变且处处唯一的常量,例如钩子函数SetWindowsHookEx的idHook参数或序列化时的版本等,就应该使用静态常量。但是用到这样的常量的机会不多。一般来说我们应该使用灵活性更高的动态常量。

               静态常量            动态常量

内存消耗       无                  因为要保存常量 有消耗

初始化         很少的简单类型,    任意类型,可以在类构造函数中赋值
               不能new,必须在
               声明同时赋值

何时发挥作用   编译时进行替换       相当于类中的数据成员



static关键字大家肯定是用的很多了,说起来大家也都知道,这有什么好谈的?

可是回想起以前的一些事情,不免叫我心中......

事情起因,一个项目中的一些类中全部都是方法,但是被设计成了非静态类了。于是我为了说服同事将这些类设计成静态的,下了好大的力度。等同事明白过来以后,我已疲惫不堪。

不知道您是否存在以下观点?

  1. static是从面向过程到面向对象的遗留产物,以往开发都是面向过程的,所以很多使用了静态类、静态方法,到了面向对象以后,这个关键字被保留下来了。因此面向对象开发中最好不用或少用static关键字。
  2. 无论是静态类还是非静态类,效果都是一样的,没什么区别。
  3. 如果你非要让我使用静态类,那么这样做的意义在哪里?
  4. 如果我把非静态类该为静态类,那么会不会有什么问题?

下面针对以上的一些观点,笔者阐述下自己的理解,如果哪里有写的不对的地方,还请指出。

  1. static关键字的确是面向过程开发的时代就有的关键字,但是并不代表是面向对象开发中就应该尽量避免static关键字。
  2. 静态类跟非静态类效果肯定是不一样的,区别肯定是有的。
  3. 根据笔者的经验,static类一般用于与状态无关的类。那么,什么是与状态无关的类?我的理解是当一个类中没有属性,只有方法的的时候,就可以认为这个类是与状态无关的类。回想非静态类实例化一个对象,目的在什么地方?目的就是通过这个实例化的对象来保存类的状态。
    不是吗?例如
    A a = new A();
    a.Name = "Kevin";
    a.Sex = "男";
    ......
    通过我们实例化的对象a,类的状态被对象a保持住了。
    如果我们的类没有属性,全是方法,那么,有必要为了调用类中的方法,先实例化一个对象出来吗?
    因此,笔者建议,在做类的设计的时候,如果类是与状态无关的类,建议将其设计为static类。
    至于说这样做的意义:首先,省略了构造一个对象的性能损耗,虽然可以忽略不计。其次,对程序员比较友好,调用类的方法更加的方便。
  4. 只要一个类是与状态类无关的类,那么将其设计成静态类是没有问题的。
    对于以上的一些观点,纯属个人经验之谈。如果您有不同的观点,欢迎共同交流。

原创粉丝点击