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 修飾符

 

posted @ 2013-05-22 11:18  邪见  阅读(137)  评论(0)    收藏  举报