前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >静态类、静态方法、静态变量的区别

静态类、静态方法、静态变量的区别

作者头像
西柚dzh
发布2022-06-09 15:38:09
1.6K0
发布2022-06-09 15:38:09
举报
文章被收录于专栏:dcmickey小站

引言

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

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

先上结论

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

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

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

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

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

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

代码

先看测试Demo

1.非静态类 中静态方法

代码语言:javascript
复制
    /// <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.静态类静态方法

代码语言:javascript
复制
/// <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.测试代码

代码语言:javascript
复制
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后 执行的情况

代码语言:javascript
复制
------------------------普通 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

版权属于:dingzhenhua

本文链接:https://cloud.tencent.com/developer/article/2019131

转载时须注明出处及本声明

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-01-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • 先上结论
  • 无图我还说什么? 请看代码
  • 代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档