C#中變量、常量、枚舉、預處理器指令知多少
一、變量
C#共有其中變量類型有:靜態(tài)變量、實類變量、數(shù)組元素、數(shù)值參數(shù)、引用參數(shù)、輸出參數(shù)和局部變量
先定義一個簡單的類來說明,如下:
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]數(shù)組元素</param>
/// <param name="a">數(shù)值參數(shù)</param>
/// <param name="b">引用類型</param>
/// <param name="c">輸出參數(shù)</param>
public void Fun(int[] intArray, int a, ref int b, out int c)
{
//局部變量i
var i = 0;
c = i;
}
}
對于靜態(tài)變量在被創(chuàng)建加載之后失效,當被卸載后失效,靜態(tài)變量的初始值也為此類型的變量的默認值
對于實例變量當創(chuàng)建某類的一個實例的時候,隸屬于該類的實例變量也被生成,當不再有關于這個實例的引用而且實例的析構(gòu)函數(shù)執(zhí)行了以后,此實例變量失效
對于數(shù)組元素當任意一個數(shù)組實例被創(chuàng)建時,這個數(shù)組的元素也被同時創(chuàng)建,當不再有任何正對這個數(shù)組實例的引用時,它的元素也就此失效
當一個不帶有ref 或out 修飾參數(shù)被聲明時,我們稱它為數(shù)值參數(shù)
參數(shù)當一個帶有ref 修飾語的參數(shù)被聲明時,我們稱之為引用參數(shù)
參數(shù)當一個帶有out 修飾語的參數(shù)被聲明時,我們稱之為輸出參數(shù)
局部變量被局部變量聲明語句創(chuàng)建
C#編譯器不容許在表達式中使用未初始化的變量
變量初始化要注意兩點的是:(1)變量是類或結(jié)構(gòu)中的字段,如果沒有顯示初始化,創(chuàng)建這些變量時,其默認值就是0(2)方法的局部變量必須在代碼中顯示初始化,之后才能在語句中使用它們的值。
二、常量
C#可以定義兩種類型的常量,靜態(tài)常量用const來定義在程序編譯的時候確定,一種是動態(tài)常量用readonly來定義在運行時確定
靜態(tài)常量使用方便,性能高,但一旦定義之后就不可以改變,在一個引用第三方程序集上面如果定義了一個靜態(tài)常量,當它定義的值改變時你不得不重新引用生成主程序
動態(tài)常量使用靈活,能很好的支持程序的擴展性
下面一個事例就是通過讀取XML文檔來給動態(tài)常量賦值
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;
}
}
根據(jù)傳入的路徑來解析XML文件賦值給動態(tài)常量,能很好的擴展應用程序的常量值
三、枚舉
枚舉是用戶定義的整數(shù)類型,在聲明一個枚舉時,要指定該枚舉的實例可以包含的一組可以接受的值,枚舉具有如下的優(yōu)勢:
1.枚舉可以使代碼更易于維護,有助于確定給變量指定合法的,期望的值
2.枚舉使代碼更清晰,允許用描述性的名稱來表示整數(shù),而不是含義模糊、變化多端的數(shù)
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#的預處理指令
使用預處理指令可以禁止編譯器編譯與額外功能相關的代碼,以控制不同版本擁有的功能,如企業(yè)版和基本版本
#define(給定名稱的符號)和#undef(刪除名稱的符號)一般與#if、#elif、#else、#endif結(jié)合起來使用如
沒有找到預定義的Debug就不會執(zhí)行 #if和#endif代碼塊里面的語句,這也稱為條件編譯。
同樣的預處理器指令有:#warning和#error,當編譯器遇到它們時,會分別產(chǎn)生警告或錯誤,如果編譯器遇到#warning指令,會給用戶顯示#warning后面的文本,之后編譯繼續(xù),如果編譯器遇到#error指令,就會給用戶顯示后面的文本,作為一條編譯錯誤消息,然后立即退出編譯。
#region和#endregion指令用于把一段代碼標記為有給定名稱的一個塊,#line指令用于改變編譯器在警告和錯誤信息中顯示的文件名和行號信息,#pragm可以印制或還原指定的編譯警告參考:https://msdn.microsoft.com/zh-cn/library/yt3yck0x.aspx
您可能感興趣的文章
- 01-10C#通過反射獲取當前工程中所有窗體并打開的方法
- 01-10C#實現(xiàn)Winform中打開網(wǎng)頁頁面的方法
- 01-10C#實現(xiàn)由四周向中心縮小的窗體退出特效
- 01-10Extjs4如何處理后臺json數(shù)據(jù)中日期和時間
- 01-10C#實現(xiàn)打開畫圖的同時載入圖片、最大化顯示畫圖窗體的方法
- 01-10C#中DataGridView常用操作實例小結(jié)
- 01-10C#編程獲取資源文件中圖片的方法
- 01-10asp.net中XML如何做增刪改查操作
- 01-10C#利用反射技術實現(xiàn)去掉按鈕選中時的邊框效果
- 01-10C#中查找Dictionary中的重復值的方法


閱讀排行
本欄相關
- 01-10C#通過反射獲取當前工程中所有窗體并
- 01-10關于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實現(xiàn)txt定位指定行完整實例
- 01-10WinForm實現(xiàn)仿視頻播放器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當前操作系統(tǒng)已
隨機閱讀
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 04-02jquery與jsp,用jquery
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10C#中split用法實例總結(jié)
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改


