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

    {       

    }   

}

 

本文完

你可能感兴趣的:(static)