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

 更新时间:2020年6月25日 11:20  点击:2501

一、变量

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:\GitHubProject\C#AdvancedProgramming\VariableDefine\VariableDefine\bin\Debug\Test-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;
    }
  }

参考博客:枚举知多少

四、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

[!--infotagslink--]

相关文章

  • PHP成员变量获取对比(类成员变量)

    下面本文章来给大家介绍在php中成员变量的一些对比了,文章举了四个例子在这例子中分别对不同成员变量进行测试与获取操作,下面一起来看看。 有如下4个代码示例,你认...2016-11-25
  • C#变量命名规则小结

    本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-09
  • R语言 如何删除指定变量或对象

    这篇文章主要介绍了R语言删除指定变量或对象的操作方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
  • 解决vue的router组件component在import时不能使用变量问题

    这篇文章主要介绍了解决vue的router组件component在import时不能使用变量问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-27
  • Vue select 绑定动态变量的实例讲解

    这篇文章主要介绍了Vue select 绑定动态变量的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-10-23
  • 深入理解PHP变量的值类型和引用类型

    在PHP中,大部分变量类型,如字符串,整型,浮点,数组等都是值类型的,而类和对象是引用类型,在使用的时候,需要注意这一点。看到网友在讨论PHP的&符号,要彻底理解它的用法,就有必要讨论一下变量的两种形式。PHP的变量在内存中是这样...2015-10-23
  • java中String类型变量的赋值问题介绍

    下面小编就为大家带来一篇java中String类型变量的赋值问题介绍。小编觉得挺不错的。现在分享给大家,给大家一个参考。...2016-03-28
  • C#不同类型的成员变量(字段)的默认值介绍

    虽然C#编译器为每个类型都设置了默认类型,但作为面向对象的设计原则,我们还是需要对变量进行正确的初始化。实际上这也是C#推荐的做法...2020-06-25
  • C#编程中枚举类型的使用教程

    这篇文章主要介绍了C#编程中枚举类型的使用,是C#入门学习中的基础知识,需要的朋友可以参考下...2020-06-25
  • 详解ES6实现类的私有变量的几种写法

    这篇文章主要介绍了详解ES6实现类的私有变量的几种写法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-10
  • python 实现循环定义、赋值多个变量的操作

    这篇文章主要介绍了python 实现循环定义、赋值多个变量的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
  • Nest.js环境变量配置与序列化详解

    这篇文章主要给大家介绍了关于Nest.js环境变量配置与序列化的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-21
  • C++变量,常量,数组和字符串详解

    这篇文章主要介绍了C++变量,常量,数组和字符串,是C++入门学习中的基础知识,需要的朋友可以参考下,希望能够给你带来帮助...2021-10-21
  • 在JS中如何使用css变量详解

    这篇文章主要给大家介绍了关于如何在JS中如何使用css变量以及export之javascript关键字的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2021-09-02
  • TypeScript魔法堂之枚举的超实用手册

    这篇文章主要介绍了TypeScript魔法堂之枚举的超实用手册,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-10-29
  • C#设置与获取环境变量的方法详解

    这篇文章主要给大家介绍了关于C#设置与获取环境变量的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。...2020-06-25
  • 基于条件变量的消息队列 说明介绍

    本篇文章小编为大家介绍,基于条件变量的消息队列 说明介绍。需要的朋友参考一下...2020-04-25
  • Perl中的特殊内置变量详细介绍

    这篇文章主要介绍了Perl中的特殊内置变量详细介绍,需要的朋友可以参考下...2020-06-29
  • node.js 全局变量的具体使用

    这篇文章主要介绍了node.js 全局变量的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-04-15
  • Lua判断变量是否为数字、字符串是否可以转换为数字等

    这篇文章主要介绍了Lua判断变量是否为数字、字符串是否可以转换为数字等,本文讲解了Lua 判断是字符还是数字的方法、Lua判断数字的方法、判断可否转换为数字的方法、判断并且准备一个初值的方法,需要的朋友可以参考下...2020-06-30