C#关键字:static

一、static关键字

  下面我设计了一个房贷利率上浮类(用来计算房贷利率上浮多少):

 1 public class InterestRateGoUp
 2 {
 3     public InterestRateGoUp()
 4     {
 5         Rate = 4.9m;
 6     }
 7 
 8     /// <summary>
 9     /// 基准利率
10     /// </summary>
11     public decimal Rate { get; set; }
12 
13     /// <summary>
14     /// 计算上浮
15     /// </summary>
16     /// <param name="rate">当前房贷利率</param>
17     /// <returns>返回利率上浮结果</returns>
18     public decimal CalculatorGoUp(decimal rate)
19     {
20         decimal result = (rate - Rate) / Rate;
21         return result;
22     }
23 }
24 public class RealizeObject
25 {
26     public void Realize()
27     {
28         //小玄买房利率6.37
29         InterestRateGoUp rate1 = new InterestRateGoUp();
30         float result1 = rate1.CalculatorGoUp(6.37m);
31         //小豆买房利率6.125
32         InterestRateGoUp rate2 = new InterestRateGoUp();
33         float result2 = rate2.CalculatorGoUp(6.125m);
34         //房贷基准利率变成5.88,所有的对象的基准利率均需要改变
35         rate1.Rate = 5.88m;
36         rate2.Rate = 5.88m;
37         //如果有成百上千个这样的对象,则要修改成百上千次
38     }
39 }

上面例子的问题在于基准利率这个属性是所有房贷利率上浮对象共享的属性,而不是每个房贷利率上浮对象都拥有一个基准利率。所以要把基准利率这个属性设置成共享的需要使用static关键字,第二版房贷利率上浮类:

 1 public class InterestRateGoUp
 2 {
 3     public InterestRateGoUp()
 4     {
 5         Rate = 4.9m;
 6     }
 7 
 8     /// <summary>
 9     /// 基准利率
10     /// </summary>
11     public static decimal Rate { get; set; }
12 }
13 public class RealizeObject
14 {
15     public void Realize()
16     {
17         //房贷基准利率变成5.88,只需要修改静态属性(所有的对象都使用它),静态属性的使用如下
18         InterestRateGoUp.Rate = 5.88m;
19         //使用构造函数初始化静态属性存在一个问题,就是每次创建对象都会初始化静态属性,如下会把基准利率修改为4.9
20         InterestRateGoUp rate3 = new InterestRateGoUp();
21     }
22 }

静态自动属性的初始化方式有两种,第一种是静态自动属性改为静态属性(静态属性封装一个已赋值的静态私有字段),第二种是使用静态构造函数,第三版房贷利率上浮类:

 1 public class InterestRateGoUp
 2 {
 3     /// <summary>
 4     /// 方法一:静态属性,而非静态自动属性
 5     /// </summary>
 6     private static decimal rate = 4.9m;
 7     public static decimal Rate
 8     {
 9         get { return rate; }
10         set { rate = value; }
11     }
12 
13     /// <summary>
14     /// 方法二:静态构造函数
15     /// </summary>
16     static InterestRateGoUp()
17     {
18         Rate = 4.9m;
19     }
20 }

如果计算上浮的方法CalculatorGoUp经常被使用,可以把CalculatorGoUp设置成静态的;如果整个房贷利率上浮类都是一个专门供用户使用的工具类,则可以把类和类成员全部设置成静态的。最终版房贷利率上浮类:

 1 public static class InterestRateGoUp
 2 {
 3     static InterestRateGoUp()
 4     {
 5         Rate = 4.9m;
 6     }
 7 
 8     /// <summary>
 9     /// 基准利率
10     /// </summary>
11     public static decimal Rate { get; set; }
12 
13     /// <summary>
14     /// 计算上浮
15     /// </summary>
16     /// <param name="rate">当前房贷利率</param>
17     /// <returns>返回利率上浮结果</returns>
18     public static decimal CalculatorGoUp(decimal rate)
19     {
20         decimal result = (rate - Rate) / Rate;
21         return result;
22     }
23 }
24 public class RealizeObject
25 {
26     public void Realize()
27     {
28         //小玄买房利率6.37
29         float result1 = InterestRateGoUp.CalculatorGoUp(6.37m);
30         //小豆买房利率6.125
31         float result2 = InterestRateGoUp.CalculatorGoUp(6.125m);
32         //房贷基准利率变成5.88
33         InterestRateGoUp.Rate = 5.88m;
34         //小杰买房利率5.88
35         float result3 = InterestRateGoUp.CalculatorGoUp(5.88m);
36     }
37 }

总结:

1、static关键字可以修饰在类和类型成员(字段、属性、方法、构造函数等)上。

2、static关键字修饰的内容只会创建一次并且只分配一次内存,在程序结束时才被回收(不占用GC性能)。static关键字修饰的类型成员是类级别上的(它是唯一的)而不是对象级别上的,所以使用静态成员时只能通过(类名.静态成员)而不能通过(对象名.静态成员),静态类也不能使用new创建其对象。

3、实例字段/属性是每个对象独享的,每个对象都会为自己的每个实例数据分配内存空间,而静态字段/属性是所有对象共享的,无论创建多少对象,静态数据只分配一次。静态方法适用于经常被使用的情况下,可以减少内存的分配和清理次数。类的实例字段/属性和实例方法不能在静态方法中直接使用,只能通过(对象名.XXX)的方式使用。静态构造函数专为静态数据作初始化,其中它更适用于初始化在编译时未知的静态数据的值(如数据库中读取)。静态类也称为工具类,适用于整个类经常被使用,不能使用new创建它,并且只能包含用static修饰的类型成员。

备注:

1、静态构造函数只能定义一个无参静态构造函数,并且不允许有访问修饰符;

2、无论创建了多少类型的对象,静态构造函数只执行一次;

3、运行库创建类实例或调用者首次访问静态成员之前,运行库会调用静态构造函数;

4、静态构造函数的执行先于非静态构造函数。

 

部分内容引用于精通C#第六版

posted on 2019-09-10 19:30  yaojieyuan  阅读(538)  评论(0编辑  收藏  举报

导航