C#中容易混淆的幾修飾符關鍵字
C# 是面向对象的程序设计语言,每一个函数都属于一个类。
- Static:当一个方法被声明为Static时,这个方法是一个静态方法,编译器会在编译时保留这个方法的实现。也就是说,这个方法属于类,但是不属于任何成员,不管这个类的实例是否存在,它们都会存在。就像入口函数Static void Main,因为它是静态函数,所以可以直接被调用。
- Virtua:当一个方法被声明为Virtual时,它是一个虚拟方法,直到你使用ClassName variable = new ClassName();声明一个类的实例之前,它都不存在于真实的内存空间中。这个关键字在类的继承中非常常用,用来提供类方法的多态性支持。
- abstract是告诉其它想继承于他的类 你可以重写我的这个方法或属性,否则不允许。
- abstract:抽象方法声明使用,是必须被派生类覆写的方法,抽象类就是用来被继承的;可以看成是没有实现体的虚方法;如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包含其他一般方法;抽象类不能有實例的。
- overrride:表示重写
- extern: 用于声明在外部实现的方法。extern 修饰符的常见用法是在使用 Interop 服务调入非托管代码时与 DllImport 属性一起使用。在这种情况下,还必须将方法声明为 static ,例如
[DllImport("kernel32.dll", SetLastError = true)] private static extern bool AllocConsole();
也就是说这个方法是放在申明的类之外的类中实现 的.
- sealed: 表示由它修饰的类或方法将不能被继承或是重写。 sealed类不能是abstract类, 因為abstract类總是希望被繼承。 在sealed class 中virtual關鍵字失效。不是类的每个成员方法都可以作为密封方法,要作为密封方法必须对基类的虚方法进行重载,提供具体的实现方法。所以,在方法的声明中,sealed修饰符总是和override修饰符同时使用
using System; class A { public virtual void F() { Console.WriteLine("A.F"); } public virtual void G() { Console .WriteLine("A.G" ); } } class B : A { public sealed override void F() { Console .WriteLine("B.F"); } public override void G() { Console .WriteLine("B.G" ); } } class C : B { public override void G() { Console .WriteLine("C.G" ); } }
interface 與 abstract class
interface:用来声明接口
1.只提供一些方法规约,不提供方法主体. 如: public interface IPerson { void getName();//不包含方法主体 }
2.方法不能用public abstract等修饰,无字段变量,无构造函数。
3.方法可包含参数。 如 public interface IPerson { void getAge(string s); }
public interface IPerson { IPerson(); //错误 string name; //错误 public void getIDcard();//错误 void getName(); //right void getAge(string s); //right } 实现interface的类 1.与继承类的格式一致,如 public class Chinese:IPerson{} 2.必须实现 interface 中的各个方法, 且方法必須是public 的
abstract:声明抽象类、抽象方法
1.抽象方法所在类必须为抽象类
2.抽象类不能直接实例化,必须由其派生类实现。
3.抽象方法不包含方法主体,必须由派生类以override方式实现此方法
public abstract class Book { public Book() {} public abstract void getPrice(); //抽象方法,不含主体 public virtual void getName() //虚方法,可覆盖 { Console.WriteLine("this is a test:virtual getName()"); } protected virtual void getContent() //虚方法,可覆盖 { Console.WriteLine("this is a test:virtual getContent()"); } public void getDate() //一般方法,若在派生类中重写,须使用new关键字 { Console.WriteLine("this is a test: void getDate()"); } } public class JavaBook:Book { public override void getPrice() //实现抽象方法,必须实现 { Console.WriteLine("this is a test:JavaBook override abstract getPrice()"); } public override void getName() //覆盖原方法,不是必须的 { Console.WriteLine("this is a test:JavaBook override virtual getName()"); } }
virtual:标记方法为虚方法
1.可在派生类中以override覆盖此方法
2.不覆盖也可由对象调用
3.无此标记的方法(也无其他标记),重写时需用new隐藏原方法 。
4.虛方法一般建議使用 protected 修飾符

浙公网安备 33010602011771号