引言

一直疑惑静态类、静态方法、静态变量的内存驻用情况。今天就写了个Demo来深入八一八他们的区别和注意点。

为了演示方便,方法名和变量名采取中文命名

先上结论

静态变量 只在类初始化时加载一次

静态方法和静态方法语法糖 实时加载里面的内容

只读属性 实时加载里面的内容

附有初始值的属性语法糖 只在类初始化时加载一次(应该是set里面处理的,而不是get里面处理的)

静态有参方法 实时加载里面的内容

无图我还说什么? 请看代码

代码

先看测试Demo

1.非静态类 中静态方法

    /// <summary>
    /// 非静态类
    /// </summary>
    public class TestCommonService
    {
        /// <summary>
        /// 静态变量
        /// </summary>
        public static string 静态变量 = ConfigHelper.TryGetOtherProject(ProjectsEnum.SurpriseGamePollApi, "ConfigId", "");
        /// <summary>
        /// 静态方法
        /// </summary>
        /// <returns></returns>
        public static string 静态方法()
        {
            return ConfigHelper.TryGetOtherProject(ProjectsEnum.SurpriseGamePollApi, "ConfigId", "");
        }
        /// <summary>
        /// 静态方法语法糖
        /// </summary>
        /// <returns></returns>
        public static string 静态方法语法糖() => ConfigHelper.TryGetOtherProject(ProjectsEnum.SurpriseGamePollApi, "ConfigId", "");

        /// <summary>
        /// 只读属性
        /// </summary>
        public static string 只读属性 => ConfigHelper.TryGetOtherProject(ProjectsEnum.SurpriseGamePollApi, "ConfigId", "");
        /// <summary>
        /// 属性语法糖
        /// </summary>
        public static string 属性语法糖 { get; set; } = ConfigHelper.TryGetOtherProject(ProjectsEnum.SurpriseGamePollApi, "ConfigId", "");

        /// <summary>
        /// 属性
        /// </summary>
        public static string 标准属性
        {
            get
            {
                return ConfigHelper.TryGetOtherProject(ProjectsEnum.SurpriseGamePollApi, "ConfigId", "");
            }
            set
            {
            }
        }


        /// <summary>
        /// 静态有参方法
        /// </summary>
        /// <param name="isValue"></param>
        /// <returns></returns>
        public static string 静态有参方法(bool isValue)
        {
            return isValue ? $"true:{ConfigHelper.TryGetOtherProject(ProjectsEnum.SurpriseGamePollApi, "ConfigId", "")}" : $"false:{ConfigHelper.TryGetOtherProject(ProjectsEnum.SurpriseGamePollApi, "ConfigId", "")}";
        }
    }

2.静态类静态方法

/// <summary>
    /// 静态类
    /// </summary>
    public static class TestStaticService
    {
        /// <summary>
        /// 静态变量
        /// </summary>
        public static string 静态变量 = ConfigHelper.TryGetOtherProject(ProjectsEnum.SurpriseGamePollApi, "ConfigId", "");
        /// <summary>
        /// 静态方法
        /// </summary>
        /// <returns></returns>
        public static string 静态方法()
        {
            return ConfigHelper.TryGetOtherProject(ProjectsEnum.SurpriseGamePollApi, "ConfigId", "");
        }
        /// <summary>
        /// 静态方法语法糖
        /// </summary>
        /// <returns></returns>
        public static string 静态方法语法糖() => ConfigHelper.TryGetOtherProject(ProjectsEnum.SurpriseGamePollApi, "ConfigId", "");

        /// <summary>
        /// 只读属性
        /// </summary>
        public static string 只读属性 => ConfigHelper.TryGetOtherProject(ProjectsEnum.SurpriseGamePollApi, "ConfigId", "");
        /// <summary>
        /// 属性语法糖
        /// </summary>
        public static string 属性语法糖 { get; set; } = ConfigHelper.TryGetOtherProject(ProjectsEnum.SurpriseGamePollApi, "ConfigId", "");

        /// <summary>
        /// 标准属性
        /// </summary>
        public static string 标准属性
        {
            get
            {
                return ConfigHelper.TryGetOtherProject(ProjectsEnum.SurpriseGamePollApi, "ConfigId", "");
            }
            set
            {
            }
        }

        /// <summary>
        /// 静态有参方法
        /// </summary>
        /// <param name="isValue"></param>
        /// <returns></returns>
        public static string 静态有参方法(bool isValue)
        {
            return isValue ? $"true:{ConfigHelper.TryGetOtherProject(ProjectsEnum.SurpriseGamePollApi, "ConfigId", "")}" : $"false:{ConfigHelper.TryGetOtherProject(ProjectsEnum.SurpriseGamePollApi, "ConfigId", "")}";
        }
    }

3.测试代码

static void Main(string[] args)
        {
            Environment.SetEnvironmentVariable("DAOKEAPPUK", "jiesan.netcore.surprisegamepollapi");
            ConfigCenterClient.Init(ProjectsEnum.List);

            Console.WriteLine($"------------------------普通 class-----------------");
            Console.WriteLine($"TestStaticService.GetConfigId1={TestStaticService.GetConfigId1}");
            Console.WriteLine($"TestStaticService.GetConfigId2()={TestStaticService.GetConfigId2()}");
            Console.WriteLine($"TestStaticService.GetConfigId3()={TestStaticService.GetConfigId3()}");
            Console.WriteLine($"TestStaticService.GetConfigId4={TestStaticService.GetConfigId4}");
            Console.WriteLine($"TestStaticService.GetConfigId5={TestStaticService.GetConfigId5}");
            Console.WriteLine($"TestStaticService.GetInstance(true)={TestStaticService.GetInstance(true)}");
            Console.WriteLine($"TestStaticService.GetInstance(false)={TestStaticService.GetInstance(false)}");
            Console.WriteLine($"------------------------static class-----------------");
            Console.WriteLine($"TestStaticService2.GetConfigId1={TestStaticService2.GetConfigId1}");
            Console.WriteLine($"TestStaticService2.GetConfigId2()={TestStaticService2.GetConfigId2()}");
            Console.WriteLine($"TestStaticService2.GetConfigId3()={TestStaticService2.GetConfigId3()}");
            Console.WriteLine($"TestStaticService2.GetConfigId4={TestStaticService2.GetConfigId4}");
            Console.WriteLine($"TestStaticService2.GetConfigId5={TestStaticService2.GetConfigId5}");
            Console.WriteLine($"TestStaticService2.GetInstance(true)={TestStaticService2.GetInstance(true)}");
            Console.WriteLine($"TestStaticService2.GetInstance(false)={TestStaticService2.GetInstance(false)}");

            Console.ReadKey();
        }

输出结果:

111=》222 外部配置从111修改为222后 执行的情况

------------------------普通 class-----------------
TestCommonService.静态变量=111
TestCommonService.静态方法()=111
TestCommonService.静态方法语法糖=>()=111
TestCommonService.只读属性=111
TestCommonService.属性=111
TestCommonService.标准属性=111
TestCommonService.静态有参方法(true)=true:111
TestCommonService.静态有参方法(false)=false:111
------------------------静态 class-----------------
TestStaticService.静态变量=111
TestStaticService.静态方法()=111
TestStaticService.静态方法语法糖=>()=111
TestStaticService.只读属性=111
TestStaticService.属性语法糖=111
TestStaticService.标准属性=111
TestStaticService.静态有参方法(true)=true:111
TestStaticService.静态有参方法(false)=false:111
[15:59:17 INF] [tcbase.configcenter.client](6.5.3) jiesan.netcore.surprisegamepollapi配置项已改变,正在重新加载
 ------------------------普通 class-----------------
TestCommonService.静态变量=111
TestCommonService.静态方法()=222
TestCommonService.静态方法语法糖=>()=222
TestCommonService.只读属性=222
TestCommonService.属性=111
TestCommonService.标准属性=222
TestCommonService.静态有参方法(true)=true:222
TestCommonService.静态有参方法(false)=false:222
------------------------静态 class-----------------
TestStaticService.静态变量=111
TestStaticService.静态方法()=222
TestStaticService.静态方法语法糖=>()=222
TestStaticService.只读属性=222
TestStaticService.属性语法糖=111
TestStaticService.标准属性=222
TestStaticService.静态有参方法(true)=true:222
TestStaticService.静态有参方法(false)=false:222