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 ()
    {       
    }   
}

 

本文完

原文地址:https://www.cnblogs.com/Aphasia/p/4348536.html