C 成員可訪問性

2021-05-17 19:59:07 字數 2542 閱讀 6981

c#成員可訪問性 收藏

根據網上資料整理而成。

一、c#中已宣告的可訪問性:

1. public:訪問不受限制;

2. internal:訪問僅限於所屬程式集;

3. protected:訪問僅限於當前類和其子類;

4. internal protected:訪問僅限於當前程式集或其子類(子類可以不屬於當前程式集);

5. private:訪問僅限於包含該成員的型別。

二、預設可訪問性

1. 命名空間(namespace)隱式地具有public訪問性,且不允許有訪問修飾符;

2. 編輯單元或命名空間中宣告的型別可以具有public或internal可訪問性,預設為internal;

3. 類(class)的預設訪問級別為internal;

4. 結構體(struct)預設訪問級別為private;

5. 介面(inte***ce)預設訪問基本為internal;但是如果在其他public類中使用時,必須為public;

6. 類和結構體成員(成員函式和成員變數)預設訪問級別為private;(但是宣告為命名空間成員的型別只能具有public或internal可訪問性);

7. 介面的成員隱式地具有public可訪問性,在介面成員的宣告中不允許使用訪問修飾符;

6. 列舉的成員隱式地具有public可訪問性,宣告中不允許使用訪問修飾符。

三、可訪問性約束

1. 類型別的直接基類必須至少與該類型別本身具有相同的可訪問性;

2. 介面型別的基介面必須至少與該介面型別本身具有相同的可訪問性;

3. 委託型別的返回型別和引數型別必須至少與該委託型別本身具有相同的可訪問性;

4. 常量的型別必須至少與該常量本身具有相同的可訪問性;

5. 域的型別必須至少與該域本身具有相同的可訪問性;

6. 方法的返回型別和引數型別必須至少與該方法本身具有相同的可訪問性;

7. 屬性的型別必須至少與該屬性本身具有相同的可訪問性;

8. 事件的型別必須至少與該事件本身具有相同的可訪問性;

9. 索引器的型別和引數型別必須與該索引器本身具有相同的可訪問性;

10. 運算子的返回型別和引數型別必須至少與該運算子本身具有相同的可訪問性;

11. 例項建構函式的引數型別必須至少與該例項建構函式本身具有相同的可訪問性。

四、可訪問域

1. 預定義型別(例如object、int或double)可訪問域是無限的;

2. 在程式p中宣告的頂級型別(不是在某個型別中宣告的成員)t的可訪問域是指:

1).如果t的已宣告可訪問性為public,則t的可訪問域將是p以及引用p的任何程式的程式文字;

2).如果t的已宣告可訪問性為internal,則t的可訪問域將是p的程式文字。

可見,定及型別的可訪問域始終至少是在其中宣告該型別的程式的程式文字。

3. 在程式p的型別t中宣告的巢狀成員(在其他型別中宣告的成員)m,其可訪問域是如下所指之一(m本身也可能是乙個型別):

1).如果m的已宣告可訪問性為public,則m的可訪問域將是t的可訪問域;

2).如果m的已宣告可訪問性為internal protected,設d表示p的程式文字和所有從t派生的型別(這些型別是在p的外部宣告的)的程式文字的並集,則m的可訪問域將是t與d的可訪問域的交集;

3).如果m的已宣告可訪問性為protected,設d表示t的程式文字和所有從t派生的型別的程式文字的並集,則m的可訪問域將是t與d的可訪問域的交集;

4).如果m的已宣告可訪問性為internal,則m的可訪問域將是t的可訪問域與p的程式文字的交集;

5).如果m的已宣告可訪問性為private,則m的可訪問域將是t的程式文字。

可見,巢狀成員的可訪問域總是至少為宣告該成員的型別的程式文字,並且絕不會大於宣告該成員的型別的可訪問域。

例 public class a

internal class b

private class d }

在這個例子中,類和成員具有以下可訪問域:

1) a和a.x的可訪問域無限制;

2) a.y、b、b.x、b.y、b.c、b.c.x和b.c.y的可訪問域是包含這段**的程式的程式文字;

3) a.z的可訪問域是a的程式文字;

4) b.z和b.d的可訪問域是b的程式文字,包括b.c和b.d的程式文字;

5) b.c.z的可訪問域是b.c的程式文字;

6) b.d.x和b.d.y的可訪問域是b的程式文字,包括b.c和b.d的程式文字;

7) b.d.z的可訪問域是b.d的程式文字。

例:基類的所有成員(例項建構函式、析構函式和靜態建構函式除外)都由派生型別繼承,這些成員甚至包括基類的私有成員。然而,私有成員的可訪問域只包括宣告該成員的型別的程式文字。在下面的示例中,類b繼承了類a的私有成員x:

class a }

class b: a }

由於該成員是私有的,所以只能在a的類主體中對他進行訪問。因此,a.f方法中對b.x的訪問可以成功,但是b.f方法中對b.x的訪問卻會造成錯誤。

C 可訪問性約束

c 語言中的有些構造要求某個型別至少與某個成員或其他型別具有同樣的可訪問性 at least as accessible as 如果t 的可訪問域是 m可訪問域的超集,我們就說型別 t至少與成員或型別 m具有同樣的可訪問性。換言之,如果 t在可訪問 m的所有上下文中都是可訪問的,則 t至少與 m具有...

C 可訪問性級別

使用訪問修飾符 public protected internal 或private 可以為成員指定以下宣告的可訪問性之一。宣告的可訪問性 含義 public 訪問不受限制。protected 訪問僅限於包含類或從包含類派生的型別。internal 訪問僅限於當前程式集。protectedinter...

C 可訪問性級別

使用訪問修飾符 public protected internal 或 private 可以為成員指定以下宣告的可訪問性之一。宣告的可訪問性 含義public 訪問不受限制。protected 訪問僅限於包含類或從包含類派生的型別。internal 訪問僅限於當前程式集。protectedinter...