不定期更新,2017.8.9
一、new
別看new這個修飾符經常用,恐怕很多人都不知道其本質。我們先來看看new修飾符的官方定義:
new 僅允許在嵌套類聲明中使用,表明類中隱藏了由基類中繼承而來的與類中同名的成員。
看懂了嗎?不懂沒關系,咱們接着往下看
首先,我定義一個類:
1 namespace 修飾符概念 2 { 3 class new修飾符 4 { 5 6 private string StrName; 7 8 public string strName 9 { 10 get { return StrName; } 11 set { StrName = value; } 12 } 13 14 private int IntPassWord; 15 16 public int intPassWord 17 { 18 get { return IntPassWord; } 19 set { IntPassWord = value; } 20 } 21 22 //上面是倆字段和屬性,下面來構造,啊哈哈哈 23 public new修飾符( ) 24 { 25 strName = "我是蜀雲泉"; 26 intPassWord = 1234567; 27 } 28 } 29 }
這個類里面有兩個字段屬性,一個構造,構造在new的時候會調用默認的那一個,其中構造的作用就是在new的時候初始化類數據。
控制台代碼及結果:
1 namespace 修飾符概念 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 new修飾符 vae = new new修飾符(); 8 Console.WriteLine(vae.strName); 9 Console.WriteLine(vae.intPassWord); 10 Console.ReadLine(); 11 } 12 } 13 }
我的new修飾符這個類寫完之后呢他是保存在硬盤中的,和內存沒有半毛錢關系(除非這個類里面含有static關鍵字)。然后在控制台里面你new了一個該類類型的對象vae出來的時候,系統就會在內存中給這個對象vae分配一個該類大小的存儲空間出來。就是這樣。
二、public修飾符
來看看官方的定義
public 表示不限制對該類的訪問
public應該就不用講了吧,這個用的最多,只要一個成員定義成public之后呢,該類內部可以隨意的訪問他,其他類也可以隨意的訪問他,該類被繼承之后其子類也可以隨意的訪問他。通俗的說就是“我的就是大家的,隨意拿去用,別客氣”
三、protected修飾符
來看看官方的定義
protected 表示只能從所在類和所在類派生的子類進行訪問
看着官方的定義就應該明白了,我還是貼上代碼吧:
首先我新建一個類:
1 namespace 修飾符概念 2 { 3 class protected修飾符 4 { 5 private string StrName; 6 7 protected string strName 8 { 9 get { return StrName; } 10 set { StrName = value; } 11 } 12 13 protected void Start() 14 { 15 Console.WriteLine("這是被保護的一個方法"); 16 } 17 } 18 }
在控制台里面調用這個類里面的方法試試行不行:
namespace 修飾符概念 { class Program { static void Main(string[] args) { protected修飾符 vae = new protected修飾符(); vae. Console.ReadLine(); } } }
結果是無法調用的。
接下來看看子類能不能調用:
1 namespace 修飾符概念 2 { 3 class protected類的繼承者:protected修飾符 4 { 5 6 public void test() 7 { 8 Start(); 9 } 10 } 11 }
完全ok啊。
那么接下來我要做一個猜想了,其子類的實例化對象能不能調用這個保護的方法呢?
namespace 修飾符概念 { class Program { static void Main(string[] args) { protected類的繼承者 vae = new protected類的繼承者(); vae.test(); Console.ReadLine(); } } }
是可以的。好了,現在能完全了解protected的官方定義了吧。
四、static
static在百度百科里面介紹的已經很詳細了,我再敘述一下吧。static分為靜態字段和靜態方法。存儲在全局數據區,所以不占用類的空間大小。
對於一個靜態的成員。它的訪問原理跟全局變量是一樣的。但是它隱身了,一般類人看不到它,但是它又設置了隱身對自己的類可見,那么那個類就可以看到它。
一個全局變量不屬於某個類,或某個函數。
一個靜態成員對象它屬於某個類,但是它只有一個,這個類可以使用它,但是它是也公有財產,不屬於某個對象。當你為一個對象分配空間時,不用再另外給它一個空間來放靜態成員對象。所以你在sizeof()時,靜態對象的大小沒有影響。
五、internal
internal的意思就是只能在程序集中訪問。
例如下面,命名空間Test下的兩個類
namespace Test { internal class a { public void b() { Console.Write("蜀雲泉真帥"); } } public class Write { public void WriteOut() { class x = new a(); x.b(); } } }
現在我外部想調用這個類里面的方法:
//可以這么訪問 Test.Write x = new Test.Write(); x.WriteOut(); //但不可以這么訪問 Test.a x = new Test.a(); x.b();
這就是internal的功能,只能在程序集中訪問。
六、sealed
sealed是禁止繼承的修飾符,例如類A定義了sealed,那么類A就不能被繼承,同樣,可以用在虛方法,虛屬性上面。總之,就是防止被繼承。