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:\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可以印制或还原指定的编译警告参考:
上一篇: 深入了解python中元类的相关知识
下一篇: MySQL服务器的启动和关闭