一、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 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 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 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#第六版
来源:https://www.cnblogs.com/yaojieyuan/archive/2019/09/10/11502412.html |