• C#变量、常量、枚举、预处理器指令知多少


    一、变量

    C#共有其中变量类型有:静态变量、实类变量、数组元素、数值参数、引用参数、输出参数和局部变量

    先定义一个简单的类来说明,如下:

     public  class VariableDefine
        {
            private static uint variableUInt;
            public static uint VariableUInt { get => variableUInt; set => variableUInt = value; }
            string VariableStr;
            public VariableDefine(string version)
            {
                VariableStr = version;
            }
    
            public static void Fun()
            {   
                Console.WriteLine(variableUInt);
            }
    
            /// <summary>
            /// 变量类型
            /// </summary>
            /// <param name="intArray">intArray[0]数组元素</param>
            /// <param name="a">数值参数</param>
            /// <param name="b">引用类型</param>
            /// <param name="c">输出参数</param>
            public void Fun(int[] intArray, int a, ref int b, out int c)
            {
                //局部变量i
                var i = 0;
                c = i;
            }
        }

    对于静态变量在被创建加载之后失效,当被卸载后失效,静态变量的初始值也为此类型的变量的默认值

    对于实例变量当创建某类的一个实例的时候,隶属于该类的实例变量也被生成,当不再有关于这个实例的引用而且实例的析构函数执行了以后,此实例变量失效

    对于数组元素当任意一个数组实例被创建时,这个数组的元素也被同时创建,当不再有任何正对这个数组实例的引用时,它的元素也就此失效

    当一个不带有ref 或out 修饰参数被声明时,我们称它为数值参数

    参数当一个带有ref 修饰语的参数被声明时,我们称之为引用参数

    参数当一个带有out 修饰语的参数被声明时,我们称之为输出参数

    局部变量被局部变量声明语句创建

     C#编译器不容许在表达式中使用未初始化的变量

    变量初始化要注意两点的是:(1)变量是类或结构中的字段,如果没有显示初始化,创建这些变量时,其默认值就是0(2)方法的局部变量必须在代码中显示初始化,之后才能在语句中使用它们的值。

    二、常量

    C#可以定义两种类型的常量,静态常量用const来定义在程序编译的时候确定,一种是动态常量用readonly来定义在运行时确定

    静态常量使用方便,性能高,但一旦定义之后就不可以改变,在一个引用第三方程序集上面如果定义了一个静态常量,当它定义的值改变时你不得不重新引用生成主程序

    动态常量使用灵活,能很好的支持程序的扩展性

    下面一个事例就是通过读取XML文档来给动态常量赋值

     public sealed class ReadOnlyModel
        {
            public readonly List<Company> ListCompany;
            public ReadOnlyModel(string companyInfoPath)
            {
                XElement companys = XElement.Load(companyInfoPath);
                var elements = from e in companys.Elements("company")
                               where e.Element("name").Value.Equals("C#")
                               select e;
                ListCompany = GetListCompany(elements);
            }
    
            /// <summary>
            /// 解析xml文档
            /// </summary>
            /// <param name="elements"></param>
            /// <returns></returns>
            private List<Company> GetListCompany(IEnumerable<XElement>elements)
            {
                var listCompany = new List<Company>();
                foreach (var element in elements)
                {
                    var companyModel = new Company()
                    {
                        CompanyName = element.Element("name").Value,
                        CompanyEmail = element.Element("email").Value
                    };
                    listCompany.Add(companyModel);
                }
                return listCompany;
            }
        }

    根据传入的路径来解析XML文件赋值给动态常量,能很好的扩展应用程序的常量值

    三、枚举

    枚举是用户定义的整数类型,在声明一个枚举时,要指定该枚举的实例可以包含的一组可以接受的值,枚举具有如下的优势:

    1.枚举可以使代码更易于维护,有助于确定给变量指定合法的,期望的值

    2.枚举使代码更清晰,允许用描述性的名称来表示整数,而不是含义模糊、变化多端的数

    3.枚举也是代码更易于输入

    在实际应用中通常在枚举上面加上Description需要显示的枚举特性值,在页面显示的时候通常显示的也是枚举的特性值,所以有必要写一个获取枚举特性值的通用方法

     class Program
        {
            static void Main(string[] args)
            {
                //ReadOnlyModel readOnlyCompany = new ReadOnlyModel(@"D:GitHubProjectC#AdvancedProgrammingVariableDefineVariableDefineinDebugTest-Parking-SN.xml"); //C:Program Files(x86)FPOnline
                //foreach (var company in readOnlyCompany.ListCompany)
                //{
                //    Console.WriteLine("company name is {0} company email is {1}", company.CompanyName, company.CompanyEmail);
                //}
                //Console.WriteLine("company name is {0} company email is {1}", ConstClass.CompanyName, ConstClass.CompanyEmail);
                MemberLevel superMember = MemberLevel.SuperMember;
                Console.WriteLine(superMember.GetDescriptionEnum());
                Console.ReadKey();
            }
        }
    
        public enum MemberLevel
        {
            [Description("超级会员")]
            SuperMember=1,
            [Description("一般会员")]
            Member=2,
            [Description("普通用户")]
            GeneralUser=3
        }
    
        public static class EnumExtension
        {
            public static string GetDescriptionEnum(this Enum enumValue)
            {
                DescriptionAttribute attr = null;
                var enumType = enumValue.GetType();
                string name = Enum.GetName(enumType, enumValue);
                if (name != null)
                {
                    FieldInfo fieldInfo = enumType.GetField(name);
                    if (fieldInfo != null)
                        attr = Attribute.GetCustomAttribute(fieldInfo, typeof(DescriptionAttribute), false) as DescriptionAttribute;
                }
                if (attr != null && !string.IsNullOrEmpty(attr.Description))
                    return attr.Description;
                else return string.Empty;
            }
        }

    参考博客:http://www.cnblogs.com/xiaofeixiang/p/3872142.html枚举知多少

    四、C#的预处理指令

    使用预处理指令可以禁止编译器编译与额外功能相关的代码,以控制不同版本拥有的功能,如企业版和基本版本

    #define(给定名称的符号)和#undef(删除名称的符号)一般与#if、#elif、#else、#endif结合起来使用如

    没有找到预定义的Debug就不会执行 #if和#endif代码块里面的语句,这也称为条件编译。

    同样的预处理器指令有:#warning和#error,当编译器遇到它们时,会分别产生警告或错误,如果编译器遇到#warning指令,会给用户显示#warning后面的文本,之后编译继续,如果编译器遇到#error指令,就会给用户显示后面的文本,作为一条编译错误消息,然后立即退出编译。

    #region和#endregion指令用于把一段代码标记为有给定名称的一个块,#line指令用于改变编译器在警告和错误信息中显示的文件名和行号信息,#pragm可以印制或还原指定的编译警告参考:https://msdn.microsoft.com/zh-cn/library/yt3yck0x.aspx

  • 相关阅读:
    python面试题目
    Mysql综合练习作业50题
    django rest framework自定义返回格式
    mongodb副本集部署
    celery学习笔记
    npm学习笔记
    awk学习笔记
    SaltStack grains学习笔记
    nginx + uwsgi + centos7部署django
    Reids集群安装
  • 原文地址:https://www.cnblogs.com/simen-tan/p/Simen-Net.html
Copyright © 2020-2023  润新知