C#中變量、常量、枚舉、預處理器指令知多少。本站提示廣大學習愛好者:(C#中變量、常量、枚舉、預處理器指令知多少)文章只能為提供參考,不一定能成為您想要的結果。以下是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可以印制或還原指定的編譯警告參考:https://msdn.microsoft.com/zh-cn/library/yt3yck0x.aspx