C# 中訪問修飾符

用通過代碼:

 類內部

using System;
class Mod
{
    
void defaultMethod()
    
{
        Console.WriteLine(
"this is a default method");
    }


    
public void publicMethod()
    
{
        Console.WriteLine(
"this is a public method");

    }

    
private void privateMethod()
    
{
        Console.WriteLine(
"this is a private method");
    }


    
internal void internalMethod()
    
{
        Console.WriteLine(
"this is a internal method");
    }


    
protected void protectedMethod()
    
{
        Console.WriteLine(
"this is a protected method");
    }


    
protected internal void protectInternalMethod()
    
{
        Console.WriteLine(
"this is a protected internal method");
    }


    
static void Main()
    
{
        Mod mod
=new Mod();
        mod.defaultMethod();
        mod.publicMethod();
        mod.privateMethod();
        mod.internalMethod();
        mod.protectedMethod();
        mod.protectInternalMethod();
    }


}


D:/Project/handing/char>Method1
this is a default method
this is a public method
this is a private method
this is a internal method
this is a protected method
this is a protected internal method

 子類

using System;
class Mod
{
    
void defaultMethod()
    
...{
        Console.WriteLine(
"this is a default method");
    }


    
public void publicMethod()
    
...{
        Console.WriteLine(
"this is a public method");

    }

    
private void privateMethod()
    
...{
        Console.WriteLine(
"this is a private method");
    }


    
internal void internalMethod()
    
...{
        Console.WriteLine(
"this is a internal method");
    }


    
protected void protectedMethod()
    
...{
        Console.WriteLine(
"this is a protected method");
    }


    
protected internal void protectInternalMethod()
    
...{
        Console.WriteLine(
"this is a protected internal method");
    }


}


class Test
{
        
static void Main()
            
{
                Mod mod
=new Mod();
            
//    mod.defaultMethod();
                mod.publicMethod();
            
//    mod.privateMethod();
                mod.internalMethod();
            
//    mod.protectedMethod();
                mod.protectInternalMethod();
            }

}

 

D:/Project/handing/char>Method2
this is a public method
this is a internal method
this is a protected internal method

 

程序集內

using System;
class Mod
{
    
void defaultMethod()
    
...{
        Console.WriteLine(
"this is a default method");
    }


    
public void publicMethod()
    
...{
        Console.WriteLine(
"this is a public method");

    }

    
private void privateMethod()
    
...{
        Console.WriteLine(
"this is a private method");
    }


    
internal void internalMethod()
    
...{
        Console.WriteLine(
"this is a internal method");
    }


    
protected void protectedMethod()
    
...{
        Console.WriteLine(
"this is a protected method");
    }


    
protected internal void protectInternalMethod()
    
...{
        Console.WriteLine(
"this is a protected internal method");
    }



}

class Modl : Mod
{
    
static void Main()
    
{
        Modl mod
=new Modl();
            
    
//    mod.defaultMethod();
        mod.publicMethod();
    
//    mod.privateMethod();
        mod.internalMethod();
        mod.protectedMethod();
        mod.protectInternalMethod();
    }

    


}

 

D:/Project/handing/char>Method3
this is a public method
this is a internal method
this is a protected method
this is a protected internal method

程序集外

放在同一個NAMESPACE中,區別於JAVA的包。

 D:/Project/handing/04_01>csc /target:library Method4.cs
Microsoft (R) Visual C# 2005 編譯器 版本 8.00.50727.42
用於 Microsoft (R) Windows (R) 2005 Framework 版本 2.0.50727
版權所有 (C) Microsoft Corporation 2001-2005。保留所有權利。


D:/Project/handing/04_01>csc /r:Method4.dll Method5.cs
Microsoft (R) Visual C# 2005 編譯器 版本 8.00.50727.42
用於 Microsoft (R) Windows (R) 2005 Framework 版本 2.0.50727
版權所有 (C) Microsoft Corporation 2001-2005。保留所有權利。


D:/Project/handing/04_01>Method5
this is a public method

Method4.cs

using System;
namespace 4
{
    
public class Mod
        
{
            
void defaultMethod()
            
{
                Console.WriteLine(
"this is a default method");
            }


            
public void publicMethod()
            
{
                Console.WriteLine(
"this is a public method");

            }

            
private void privateMethod()
            
{
                Console.WriteLine(
"this is a private method");
            }


            
internal void internalMethod()
            
{
                Console.WriteLine(
"this is a internal method");
            }


            
protected void protectedMethod()
            
{
                Console.WriteLine(
"this is a protected method");
            }


            
protected internal void protectInternalMethod()
            
{
                Console.WriteLine(
"this is a protected internal method");
            }



        }

}

Method5.cs

 

using 4;
using System;
public class Test
{
    
public    static void Main()
    
{
        Mod mod
=new Mod();
        mod.defaultMethod();
        mod.publicMethod();
        mod.privateMethod();
        mod.internalMethod();
        mod.protectedMethod();
        mod.protectInternalMethod();
    }


}

以下摘自:http://blog.csdn.net/bill1315/archive/2007/07/01/1673001.aspx

msdn的解釋如下:internal指的是同一個程序集,內部成員和類型纔是可以訪問的.內部訪問通常用於基於組件的開發,因爲它使一組組件能夠以私有方式進行合作,而不必嚮應用程序代碼的其餘部分公開

一個成員或類型只能有一個訪問修飾符,使用 protectedinternal 組合時除外。

命名空間上不允許使用訪問修飾符。命名空間沒有訪問限制。

根據發生成員聲明的上下文,只允許某些聲明的可訪問性。如果在成員聲明中未指定訪問修飾符,則使用默認的可訪問性。

不嵌套在其他類型中的頂級類型的可訪問性只能是 internal 或 public。這些類型的默認可訪問性是 internal。

嵌套類型是其他類型的成員,它們可以具有下表所示的聲明的可訪問性。

屬於 默認的成員可訪問性 該成員允許的聲明的可訪問性

enum

public

class

private

public

protected

internal

private

protected internal

interface

public

struct

private

public

internal

private


區別JAVA

Java用三個關鍵字在類的內部設定邊界:
public、private、 protected。它們的含義和用法非常易懂。這些“訪問指定詞”(access specifier)決定了緊跟其後被定義的東西可以被誰使用。
public表示緊隨其後的元素對任何人都是可用的。
private這個關鍵字表示除類型創建者和類型的內部方法之外的任何人都不能訪問的元素。private就像你與客戶端程序員之間的一堵磚牆,如果有人試圖訪問private成員,就會在編譯時得到錯誤信息。
protected關鍵字與private作用相當,差別僅在於繼承的類可以訪問protected成員,但是不能訪問private成員。

C#的訪問修飾符:

     Public:可被所屬類和成員以及不屬於類的成員訪問.

所修飾類的成員

可在任何情況下通過類的對象和類成員被使用.

所修飾的類類型

       可在任何情況下被類的訪問級別的類繼承.

       Internal:可被當前程序集訪問           

所修飾類的成員

在統一解決方案裏的使用與Public相同(與命名空間無關).出了解決方案則不可被使用.

              所修飾的類類型(其爲類的默認修飾符)

在統一解決方案,可被相同級別的類繼承(也就是說被Internal修飾的類),不可被訪問就別比自己高的類繼承(Public修飾的類).

同時,在不同解決方案,類類型不可被使用.

       Protected:可被所屬類或派生自所屬類的類型訪問.

              所修飾類的成員

1.      可被類的內部對象(隱指針this) 和類成員使用,以及在類的內部所聲明的類的對象使用.

2.      在其他類中聲明的自身類的對象卻不可訪問自身的protected成員.

3.      在同一命名空間或不同命名空間,派生自所屬類的類就繼承了父類的protected以及訪問級別以上的類成員,所以他的使用與自身聲明的成員無異,其規則參照上兩條.

所修飾的類類型

       其修飾符不能修飾類.

       Private:僅所屬類的成員纔可以訪問

              所修飾類的成員(其爲類成員的默認修飾符)

1.      可被類的內部對象和類成員使用,以及在類的內部所聲明的類的對象使用.

2.      在其他類中聲明的自身類的對象也不可訪問自身的private成員.

3.      任何情況下,private成員不可被派生類繼承.

所修飾的類類型

       其修飾符不能修飾類.

----------------------------------------

static:static 修飾符指明成員屬於類本身而不屬於類的實例。即使創建了類的多個實例,給定應用程序中只存在 static 成員的一個副本。
您只能通過對類的引用(而不是對實例的引用)來訪問 static 成員。但是,在類成員聲明中,可以通過 this 對象來訪問 static 成員。

sealed:sealed 修飾符可以應用於類、實例方法和屬性。密封類不能被繼承。密封方法會重寫基類中的方法,
但其本身不能在任何派生類中進一步重寫。當應用於方法或屬性時,sealed 修飾符必須始終與 override(C# 參考) 一起使用。

abstract:在類聲明中使用 abstract 修飾符以指示某個類只能是其他類的基類。標記爲抽象或包含在抽象類中的成員必須通過從抽象類派生的類來實現。
因爲抽象方法聲明不提供實際的實現,所以沒有方法體;方法聲明只是以一個分號結束,並且在簽名後沒有大括號 ({ })。例如:public abstract void MyMethod();

extern 修飾符用於聲明在外部實現的方法。extern 修飾符的常見用法是在使用 Interop 服務調入非託管代碼時與 DllImport 屬性一起使用;在這種情況下,該方法還必須聲明爲 static;
使用 extern 修飾符意味着方法在 C# 代碼的外部實現,而使用 abstract 修飾符意味着在類中未提供方法實現。
同樣沒有方法體


virtual:與abstract類似,只是虛方法必須實現,抽象方法可以不實現

protected:protected 關鍵字是一個成員訪問修飾符。受保護成員在它的類中可訪問並且可由派生類訪問。
    類的實例也不能訪問protected成員.

private:是一個成員訪問修飾符。私有訪問是允許的最低訪問級別。私有成員只有在聲明它們的類和結構體中才是可訪問的

readonly 關鍵字與 const 關鍵字不同。const 字段只能在該字段的聲明中初始化。readonly 字段可以在聲明或構造函數中初始化。因此,根據所使用的構造函數,readonly 字段可能具有不同的值。另外,const 字段爲編譯時常數,而 readonly 字段可用於運行時常數,

volatile 關鍵字表示字段可能被多個併發執行線程修改。聲明爲 volatile 的字段不受編譯器優化(假定由單個線程訪問)的限制。這樣可以確保該字段在任何時間呈現的都是最新的值

---------------

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章