• static 关键字


    导读

    1、静态成员(static member)

    2、静态类(static class)

    3、静态构造器(static ctor)

    4、用静态构造器实现单例模式


    静态成员

            我们知道类的成员有静态成员(static member)和实例成员(Instance Member)之分。静态成员属于类,实例成员属于对象即类的实例。我们通过类名.成员的方式访问静态成员,通过对象.成员的方式访问实例成员一个类的静态成员(主要指字段)在AppDomain所管理的内存中只有一份,无论初始化多少个对象都是访问这一份。

    看一个例子

    using System;
    
    namespace StaticDemo
    {
        // 模拟用户储户类
        public class SaveCount
        {
            private double _currBalnce;  // 当前账户余额
            private static double _currRate; // 当前存款利率 注意静态字段
            
            public double CurrRate
            {
                get{return _currRate;}
                set{_currRate = value;}
            }
            
            public SaveCount(double currBalnce)
            {
                _currBalnce = currBalnce;
            }
        }
        
        // 调用类
        class App
        {   
            static void Main()
            {
                SaveCount s1 = new SaveCount(1000);
                s1.CurrRate = 0.03;
                Console.WriteLine("当前s1利率: {0}",s1.CurrRate); 
                
                SaveCount s2 = new SaveCount(3000);
                s2.CurrRate = 0.05;
                Console.WriteLine("当前s2利率: {0}",s2.CurrRate); 
                Console.WriteLine("当前s1利率: {0}",s1.CurrRate); 
            }
        }
    }

    编译 csc demo.cs

    运行结果

    image

    可以看出对象 s2 改变了静态字段是影响到了对象 s1

     

    静态类

            用 static 修饰的类称为静态类,静态类中成员只能为静态成员。静态通在开发中常用作为工具类,附送一段项目工程中的代码

    using System;
    using System.Text;
    using System.IO;
    using System.Xml.Serialization ;
    
    namespace XXX.Common.Util
    {
        // xml 序列化帮助类
        public static class XmlSerHelper
        {    
            // 序列化
            public static string XmlSer <T >( T t)
            {
                if(t == null ) return null;
                XmlSerializer ser = new XmlSerializer(t .GetType());
                using(StringWriter sw = new StringWriter())
                {
                    ser .Serialize(sw,t );
                    return sw. ToString();
                }
            }
          
            // 反序列化
            public static T XmlDeser <T>( string xml) where T : class
            {
                if(string .IsNullOrEmpty(xml )) return default (T );
                XmlSerializer ser = new XmlSerializer(typeof(T));
                using(StringReader reader = new StringReader(xml ))
                {
                    try
                    {
                        T item = ser. Deserialize(reader ) as T;
                        return item;
                    }
                    catch(Exception )
                    {
                        return default (T);
                    }
                }
            }
        }     
    }

    调用的方式为 string xmlStr = XXX.Common.Util.XmlSer<Type>(Instance);

     

    静态构造器

    静态构造器是个好玩的东西,它有如下特性:

    1、一个给定的类(或结构)只能定义一个静态构造器

    2、静态构造器仅执行一次,与创建了多少这种类型的对象无关

    3、静态构造器不带访问修饰符,也不带任何参数

    4、当静态构造函数创建这个类的实例时,或在调用者访问第一个静态成员之前,运行库会调用静态构造器

    5、静态构造函数在任何实例级别的构造函数之前执行

    看一个例子:

    using System;
    class SaveCount
    {
        public double _currBalnce;
        private static double _curRate;
        
        public SaveCount(double blance)
        {    
            _currBalnce = blance;
            Console.WriteLine("Instance Ctor");
        }
        // 静态构造器
        static SaveCount()
        {
            Console.WriteLine("Static Ctor");
            _curRate = 0.4;
        }
        
        public double CurRate
        {
            get{return _curRate;}
            set{_curRate = value;}
        }
    }
    
    class App
    {
        static void Main()
        {
            SaveCount s1 = new SaveCount(50);
            SaveCount s2 = new SaveCount(100);
            
            // 获取并设置s1 利率
            Console.WriteLine("当前s1利率 {0}",s1.CurRate);
            s1.CurRate = 0.08;
            
            SaveCount s3 = new SaveCount(150);
            Console.WriteLine("当前s3利率 {0}",s3.CurRate);
        }
    }

    编译 csc demo.cs

    运行效果为

    image

     

    用静态构造器实现单例模式

    代码如下(写法有好几种,下面的是最简单的)

    public sealed class Singleton
    {   
        // 不允许更改,只运行读,所以用 readonly
        // 为什么不用 const,因为const 必须在编译时确定值
        // 内联初始化,编译器会自己调用 staic constructor
        public readonly static Singleton instance = new Singleton();
        // 禁用到公有 构造器
        private Singleton ()
        {       
        }   
    }

     

    本文完

  • 相关阅读:
    MQ怎么解决消息堆积的问题
    怎么解决Mysql的超大分页
    微信小程序开发入门 —— 认识微信小程序
    C++中strcpy()函数和strcpy_s()函数的使用及注意事项
    UML免费建模工具
    UML 各种图总结精华
    TIFF 文件格式
    LIBTIFF+VS15+WIN10编译
    LIBTIFF VS2013下编译LIBTIFF4.0.9
    Qt 多线程之QtConcurrent::map(处理序列容器)
  • 原文地址:https://www.cnblogs.com/Aphasia/p/4348536.html
Copyright © 2020-2023  润新知