修飾欄位
欄位,成員變數,它表示儲存位置,是C#中類不可缺少的一部分.
修飾欄位C#提供5種:
internal :擴充了C++原來的friend修飾符.在有必要使兩個類的某些欄位相互可見時,我們將這些類的欄位聲明為 internal,然後將它們放在一個程式集中編譯即可.如果對它們的繼承子類也可見的話,聲明為protected internal實際這也是程式集本來的意圖,即將邏輯相關的的類組合封裝在一起.
readonly唯讀欄位:唯讀不能進行寫操作,const關鍵字也不能被修改
1.const ,readonly的值一旦被初始化都不可以在改寫
2.const只能在聲明時初始化 ,readonly即可以在聲明時初始化,也可以在構造器中初始化.
3.const隱含static,不可以再寫static const;readonly不預設static,如需要可以寫static readonly
4.const是編譯靜態解析的常量,因此起運算式必須在編譯時間就可以求值,readonly是運行期動態解析的常量
5.const可用來修飾類中的成員,也可以修飾函數體內的局部變數;readonly只可以用於修飾類中的成員
static 靜態方法
1.靜態方法是一種特殊的成員方法,它不屬於類的某一個具體的執行個體,屬於類本身。
class MyClass<br /> {<br /> public static int add(int x,int y)<br /> {<br /> ........//代碼<br /> }<br /> }<br /> using syestem;<br /> class class1<br /> {<br /> [STAThread]<br /> static void Main()<br /> {<br /> int i=MyClass.add(3,5);//調用靜態方法<br /> }<br /> }
2.static:靜態欄位屬於類,為類的所有對象所共用.非靜態欄位屬於某個具體的對象,為特定的對象專有.
非靜態成員在類的每個執行個體中都佔有一個儲存或者說是一個副本,而靜態方法為類所共用的它無法判斷當前 的非靜態成員屬於那一個執行個體。
所以在靜態方法不能使用非靜態成員
。
class A<br /> {<br /> int x;<br /> static int y;<br /> static int F()<br /> {<br /> x=1;//錯誤,不容許訪問非靜態成員<br /> y=2;//正確<br /> }<br /> }
C#嚴格歸定非靜態欄位只能通過對象來訪問,靜態欄位只能通過類來訪問。
c#中abstract與virtual的區別
1.abstract方法只能在抽象類別中聲明,虛方法則不是。
abstract方法必須在衍生類別中重寫,而virtual則不必
2.abstract方法不能聲明方法實體,
abstract public void SD();
虛方法則可以
public virtual void sdf()<br /> {<br /> Console.WriteLine("A");<br /> }
3.虛方法可以實現多態,而抽象方法不可以。。。
virtual標記方法為虛方法
1.可在衍生類別中以override覆蓋此方法
2.不覆蓋也可由對象調用
3.無此標記的方法(也無其他標記),重寫時需用new隱藏原方法
abstract 與virtual : 方法重寫時都使用 override 關鍵
using System;<br />using System.Collections.Generic;<br />using System.Linq;<br />using System.Text;</p><p> public class Test<br /> {<br /> public static void Main(String[] args)<br /> {<br /> A a=new B();<br /> Console.Write(a.getVal()); // 輸出:A 雖然執行個體是B,但是執行的卻是A的方法 </p><p> a=new C();<br /> Console.Write(a.getVal()); // 輸出:C 執行個體是C,而且C重寫的A的方法,所以執行C的方法 </p><p> B b=new B();<br /> Console.Write(b.getVal()); // 輸出:B 只有定義和執行個體都是B,才執行B的方法<br /> }<br /> }<br />class A<br />{<br /> // 要允許子類重寫,方法必須標識為virtual 或 abstract<br /> public virtual String getVal(){<br /> return "A";<br /> }<br />}<br />class B : A<br />{<br /> // 隱藏父類方法 用new標識,不標識時會出現編譯警告,不影響使用<br /> //調用的時候會運行基類的同名方法,而不會調用子類有new關鍵字的方法<br /> public new String getVal(){<br /> return "B";<br /> }<br />}<br />class C : A<br />{<br /> // 重寫方法 必須用override標識<br /> public override String getVal(){<br /> return "C";<br /> }<br />}<br />