前言: 完全是我在學習過程中記錄的筆記,只不過分享一下讓很多剛開始學習.net編程的人能夠很快的學會C#語言
- 存取修飾詞(1)
(1)用在類型上面
1)public 表示在任何地方都能夠被訪問
2)internal 表示只能在當前項目中被訪問
(2)用在成員上面(欄位方法等)
1)public 可以在任何地方被訪問
2)private
3)protected
4)internal 表示只能在當前程式集完全公開
5)protected internal
(3)圖示說明5個存取修飾詞的關係
- 存取層級約束
(1) 子類的存取層級不能比父類的高
class MyBase
{
}
public class MySub:MyBase
{
}
//這樣寫是錯誤的
(2) 欄位和屬性的存取層級不能高於對應成員的存取層級
class MyField
{
}
public class MyClass
{
MyField m;
public MyField M
{
get{return m;}
set{m=value;}
}
}
//這樣寫是錯誤的
(3) 方法的存取層級不能高於參數與傳回值的存取層級
class MyInternal
{
}
public class MyClass
{
public MyInternal Func(MyInternal f)
{
}
}
//這樣寫是錯誤的
(4)"可訪問性不一致"的錯誤
(5)不允許訪問不可訪問的成員 //寫代碼遵循這句話
- 靜態方法
(1) 文法:
public static 傳回型別 方法名(參數名)
{
//過程
}
(2) 靜態方法通過類名進行調用
class MyStatic
{
public static string GetString(string str)
{
return "$" + str + "$";
}
}
class Program
{
static void Main(string[] args)
{
string Name = MyStatic.GetString("韓迎龍");
Console.WriteLine(Name);
}
}
(3)靜態方法,靜態欄位等都稱為靜態成員
1)靜態成員屬於類
2)執行個體成員屬於當前對象
class WindowsPhone
{
public static int num;
public WindowsPhone()
{
num++;
}
string sim;
public string Sim
{
get { return sim; }
set { sim = value; }
}
}
class Program
{
//靜態屬於所有該類的對象,是類的一個成員,而執行個體成員只屬於當前的執行個體
static void Main(string[] args)
{
for (int i = 0; i < 100; i++)
{
new WindowsPhone();
}
WindowsPhone windows = new WindowsPhone();
windows.Sim = "232434343";
Console.WriteLine(windows.Sim);
Console.WriteLine(WindowsPhone.num);
}
}
(4)靜態成員和執行個體成員的使用
1)靜態成員
->在靜態方法中,可以訪問靜態成員
->在靜態方法中,不可以直接存取執行個體成員
->調用前初始化
2)執行個體成員
->在執行個體方法中,可以直接存取靜態成員
->在執行個體方法中,可以直接存取執行個體成員
->執行個體化對象時初始化
(5)如果一個類裡面的成員全是靜態,那麼可以將這個類寫靜態
static class MyClass
{
//成員
}
(6)靜態類的成員必須都是靜態
static class MyClass
{
public static int GetNum()
{
return new Random().Next();
}
}
class Program
{
static void Main(string[] args)
{
int num= MyClass.GetNum();
Console.WriteLine(num);
}
}
- 靜態成員
(1) 給欄位的賦值都是由構造方法完成的,即使寫欄位的時候,對其進行初始化,也是有構造方法賦值的
(2)如果調試的時候,回先執列欄位的初始化過程,在進入到建構函式的。
class MyClass
{
public static int numStatic = 20;
//在構造方法裡面賦值的
int num = 10;
public MyClass()
{
}
}
class Program
{
static void Main(string[] args)
{
new MyClass();
}
}
//斷點調試先執行int num = 10;,在執行構造方法
(3)靜態欄位的賦值也是由靜態構造方法完成的
1)文法:
static 類名()
{
//賦值過程
}
2)靜態構造方法只能這樣寫
3)靜態構造方法不允許手動調用,由系統自動調用
4)當程式第一次訪問該類的時候(無論是靜態還是非靜態)
5)靜態構造方法只被調用一次
class MyClass
{
public static int numS;
static MyClass()
{
numS = 10;
}
int numI;
public MyClass()
{
numI = 20;
}
}
class Program
{
static void Main(string[] args)
{
//第一種情況 訪問執行個體成員
new MyClass();
new MyClass();
//第二種 訪問靜態成員
MyClass.numS = 40;
}
}
//在靜態構造方法前面加斷點執行
(4)構造方法的預設值
1)構造方法就是為欄位賦值用的,如果沒有顯示的提供賦值,那麼會有預設值
->數實值型別 0
->字元類型 /0
->字串類型 null
->bool類型 false
(5)靜態成員只有在第一次訪問的時候進行初始化,但是會一直保留在記憶體中
1)對於靜態欄位容易造成記憶體的溢出
class Program
{
static List<string> list = new List<string>();
static void Main(string[] args)
{
while (true)
{
list.Add("123232435343");
}
}
}
- 靜態類的繼承問題
(1) 靜態類不允許被繼承,靜態類只能繼承自object
(2)繼承(多態)與靜態是兩個互斥的概念
(3)靜態類不能實現任何介面
(4)sealed關鍵字
1)密封類(密閉類),表示不能別繼承
2)string就是密封類
3)可以使用重寫方法不再被重寫
(5)靜態類的本質
1)查看IL代碼 :abstract+sealed
2)不允許執行個體化 abstract
3)不允許被繼承 sealed
(6)舉例說明:
class MyClass1
{
}
sealed class MyClass2
{
}
class MySub : MyClass1
{
}
class MySub2:MyClass2 //這樣寫是錯誤的
{
}