標籤:
/*static的相關內容:靜態欄位,靜態屬性,靜態方法,,靜態構造,靜態類,readonly,const,嵌套類,部分類別 * static可以理解為全域的,共用同一塊記憶體 * 可以通過default(類型名)得到每個類型的預設值 * 靜態欄位不從屬於欄位而是從屬與類,而執行個體欄位都是從屬於每個欄位,針對於每個欄位都有不同的值 * 類和對象都能關聯資料; * this是用於執行個體的存取方法,所以你能用this.靜態成員進行訪問 * 要想在靜態方法中獲得執行個體成員的訪問,就必須先獲得對欄位或方法所從屬於的那個特定的執行個體的引用,Main()就是靜態方法 * 靜態構造器是用於對類(No is instance of Class)進行初始化,沒有靜態終結器的說法 * 靜態構造器不現實調用,相反,CLR在首次訪問類的時候自動調用靜態構造器,記住,靜態建構函式是在運行時調用的, * 靜態建構函式在編譯成IL語言是變成.cctor(),而執行個體靜態建構函式是.ctor() * 規範:應盡量使用內聯(inline),不要使用靜態建構函式進行初始化,也避免在聲明是進行初始化 * 靜態建構函式是private 自己寫的話不允許有修飾符 * 由於靜態構造器不允許顯示調用,所以不允許任何參數 * 有的類不包含任何執行個體成員,所以這種類就要declare為靜態類,也就是說靜態類裡面不包含instance成員,跟前面的學習可以知道,執行個體類可以包含靜態成員 * 靜態類被編譯成IL時會被標記為abstract和sealed表示不可擴充,不能從它派生出任何類 * 靜態類被編譯曾CIL時,沒有執行個體構造,靜態構造是在CLR裡面的 * 學習英語:generated產生,via 通過,invoke調用,derived衍生的,nested嵌套的,literal字面的 * 要將永恒不變的值聲明為const常量,以後有可能要改變的declare為readonly(只能用於欄位,不能用於據不變數) * readonly fileds cannot be set outside the costrustor.要不就直接在聲明時設初值(只有兩種情況下可以為readonly設定值:聲明時,建構函式中) * 在類中可以定義一個類,稱為嵌套類,在類中定義的類可以用private,但是在命名空間中只能定義internal和public; * 避免使用公用類型的嵌套類 * 部分類別是將一個類的定義劃分到多個檔案夾下,分布方法只能在分布類中,在編譯的時候直接弄成一個類了 * 分布方法不能有存取修飾詞或virtual,abstract,override,new,sealed,huo extern修飾符 * User: YuanWei * Date: 2015/1/15 * Time: 16:30 * * */using System;namespace LearningStatic{// private class Person// {// //會報錯:在命名空間中定義的元素無法顯示的聲明為private,protected或protected internal,但是可以聲明為public和internal// } /*部分類別:的主要作用是一個類的定義劃分到多個檔案中,常用於代碼產生器,但也可以在同一個類中定義多個部分類別 * */ public partial class Person { public string Name{get;set;} public double Height{set;get;} partial void Talk()//分布方法不能有存取修飾詞或virtual,abstract,override,new,sealed,huo extern修飾符 {}//私人的 } public partial class Person { partial void Talk(); public DateTime Birthday{get;set;} }// public class Program// {// //會報錯,命名空間下已經包含了Program的定義,也就是說同一個明明空間下是不能包含出部分類別以外的相同的類// } class Program { public static void Main(string[] args) { /*有一個靈感:如果想給某個類的實力成員做一個標記的話。可以定義一個static欄位,建構函式裡每次將這個值賦值給一個欄位,然後進行自增 * 那麼這每個對象都有特定的標籤了 * */ // TODO: Implement Functionality Here Person person=new Person();// person能夠點出來所有的public成員; Employee employee=new Employee(); Console.WriteLine(employee.PI.ToString()); Console.WriteLine(Employee.ID.ToString()); //Console.WriteLine(default(int)); Console.WriteLine(Employee.Sex); Console.WriteLine(Employee.Name); Math.Abs(-1); Console.ReadKey(true); } } public class Employee { public readonly double PI=3.1415926;//執行個體唯讀欄位,readonly 的值可以在建構函式中修改,而const不可以 public readonly static int ID=23;//靜態唯讀欄位有兩種寫法,readonly的static可以交換,只能在靜態建構函式和聲明初始化的時候set value. public static readonly int Num=45;//正規的寫法 public const string Sex="female";//會自動轉換成靜態欄位,所以可以通過類型名.Sex進行訪問,所以通過執行個體是不能進行訪問的 public static string Name; public int Height; public static int Age{get;set;}//靜態屬性,封裝了靜態欄位,安全度提高 public static void Add() {// this.Name="YuanWei";//錯誤。不能用this訪問靜態成員// 用this點不出來靜成員 Employee.Name="HongLi";//用類名能訪問的是靜態成員// this.Height=180;//,錯誤,用this(instance)訪問的是執行個體成員,所以要想在靜態方法中訪問執行個體成員的話就要先獲得特定對象的引用 //this在靜態屬性,靜態方法或靜態欄位初始值的設定無效 Employee employee=new Employee(); employee.Height=180; FirstEmployee.Age=20;//可以通過虛類.成員名調用 } public double Say() {// PI=3.1415926;//會報錯:Error: read-only fileds cannot be set outside the constructor or when declaring return Math.PI; }// public static Employee()//錯誤,靜態建構函式是不允許出現存取修飾詞,所以靜態建構函式就是private的// {} /// <summary> /// 執行個體建構函式 /// </summary> public Employee() { PI=3.14;//readonly修飾的可以在構造中修改 Employee.Name="XiaoHong"; Console.WriteLine("調用執行個體構造"); } /// <summary> /// 靜態建構函式 /// </summary> static Employee()//優先順序高,所以這裡面的值會被後調用的值覆蓋掉 { Employee.Name="XiaoMing"; Console.WriteLine("調用靜態構造"); } } /// <summary> /// 靜態類 /// </summary>// public static class NewEmployee:Employee//這種定義是錯誤的,報錯原因是靜態類必須從對象派生// {// // } public static class NewEmployee//會自動產生一個靜態構造 { public const int MaxNum=123456;//自動編譯成靜態literal欄位 public readonly static string N="nI";//編譯成靜態inionly string欄位// public static const int MinVal=123;//錯誤,不能將常量標記為靜態 }// public static class NewFirstEmployee:NewEmployee//錯誤,靜態類也不能從靜態類派生// {} public abstract class FirstEmployee:Employee//虛類可以從執行個體類進行派生 { //會自動產生一個protected的建構函式 }// public static class NewFirstEmployee:FirstEmployee//錯誤// {} public abstract class SecondEmployee//抽象類別的建構函式都是protected的 { }}
C# 靜態static 嵌套類 部分類別