zoukankan      html  css  js  c++  java
  • C# 基础系列类二(静态类及扩展方法)

      继续上一篇的内容,其实这两篇没有什么关联。这次我们 要静态类的学习。我们先新建两个项目--AssemblyLibrary(类库)和ConsolTest(控制台)

      

      静态类是一种很特殊的类,他有四个特点: 

    仅包含静态成员。
    
    无法实例化。
    
    不能被继承
    
    不能包含实例构造函数。
    

      AssemblyLibrary:  

     public static class StaticClass
        {
            //string  a; 错误:仅包含静态成员
            static string a;
            static StaticClass()
            {
                a = "1";
            }
    
            //错误:没有实例构造函数
            //public StaticClass()
            //{
     
            //}
        }
    
        public class SS : BuTongClass //错误:不能被继承 StaticClass
        {
            public SS()
                : base(1)
            { }
        }
    
        public class BuTongClass
        {
            public readonly static int i = 0;
            static BuTongClass()
            {
                i = 1;
            }
    
            public bool Equle;
            public BuTongClass(int a)
            {
                if (a == i)
                    Equle = true;
            }
        }
    

     ConsolTest

            static void Main(string[] args)
            {
                BuTongClass butong = new BuTongClass(1);
                //StaticClass sc = new StaticClass(); 错误:不能被实例化
                Console.WriteLine(butong.Equle);
                Console.Read();
            }
    

      错误的地方我都注释掉了。也附上了错误点在那里。

      运行的结果:True。

      

      如果你想对静态的只读变量继续赋值

     public readonly static int i = 0; 这样可以赋值,也可以再静态构造函数中赋值

      静态构造函数里面的变量必须是静态成员而且只能执行一次。如果利用好这个特性,我们可以完成一些意想不到的效果,比如单例模式

      传统的代码代码:  

    View Code
     public class SingeClass
        {
            private static SingeClass _instance;
    
            private static object o = new object();
            public static SingeClass GetInstance()
            {
                if (_instance == null)
                {
                    lock (o)
                    {
                        if (_instance == null)
                            _instance = new SingeClass();
                    }
                }
                return _instance;
            }
        }

    我们可以利用静态构造函数的特点,实现单例:

        public class SingeClass
        {
            private static SingeClass _instance;
    
            static SingeClass()
            {
                _instance = new SingeClass();
            }
    
        private SingeClass(){}

    public static SingeClass GetInstance() { return _instance; } }

      昨天晚上写的不够严谨,现在把默认构造函数设置为private,让外部不能实例化 。这里谢谢@看风景的人同学的提醒,

      静态构造函数,相对而言,使用的不多,他的调用时.net做的如果有多个静态构造函数,那个先调用,我们不得而知。静态类,现在使用的最多的扩展方法。在framework3.5以上,

    名称空间System.Linq就使用了大量的扩展方法

      扩展方法,他必须是静态类。扩展的方法也必须是静态方法。

    这是system.linq中的一个扩展方法的事例:我们可以看到的个是   static 类型扩展方法名(this 扩展的对象,xxxxx)

    我们直接来个简单的例子

        class Program
        {
            static void Main(string[] args)
            {
                string str = "1"; ;
                Console.WriteLine(str.ToInt());
                Console.Read();
            }
        }
    
        public static class StringEx
        {
            public static int ToInt(this string source)
            {
                int result;
                if (int.TryParse(source, out result))
                    return result;
                return 0;
            }
        }
    

      很简单吧~~~我还是必须喜欢这个扩展方法的。直接用智能提示,代码量少了,你只要敲个.就可以 出 方法名字,前提是,你已经应用 了 你 写的扩展方法。

      坚持星期一到四,一天一篇。直到我写完基础篇,就当是自我复习。

     

  • 相关阅读:
    spring给容器中注入组件的几种方式
    Linux多进程
    Linux多进程的应用
    Linux进程通信
    Linux信号
    Linux共享内存
    Linux信号量
    Linux多线程
    Linux线程同步
    Linux调用可执行程序
  • 原文地址:https://www.cnblogs.com/qionghua/p/2596658.html
Copyright © 2011-2022 走看看