c訪問修飾符
1. 與C++等語言相比,C#中增加的一個類成員訪問修飾符是什麼謝啦
1. C#中類的修飾符:
public—— 表示不限制對該類的訪問,最開放,所有的本程序集以及其他的程序集裡面的對象都能夠訪問
protected ——表示只能從所在類和所在類派生的子類進行訪問
private ——只有其所在類才能訪問
internal ——本程序集內的成員可以訪問
abstract—— 抽象類不允許建立類的實例。修飾方法的時候表示該方法需要由子類來實現,如果子類沒有實現該方法那麼子類同樣是抽象類;且含有抽象方法的類一定是抽象類
sealed——修飾類時表示該類不能夠被繼承,修飾方法時表示該方法不能被覆寫
partial——部分類,可以將一個類分成幾部分寫在不同文件中,最終編譯時將合並成一個文件,且各個部 分不能分散在不同程序集中
static——修飾類時表示該類時靜態類,不能夠實例化該類的對象,既然不能實例化該類,那麼這個類也 就不能夠含有對象成員,即該類所有成員為靜態
2. C#成員修飾符
類的成員包括構造方法、屬性、方法等。
Public:最開放,所有的本程序集以及其他的程序集裡面的對象都能夠訪問。
Protected: 比較開放,自身成員以及子類成員可訪問。
Private:只有自身成員才能夠訪問。
Internal:本程序集內的成員可以訪問。
Abstract:修飾方法的時候表示該方法需要由子類來實現,如果子類沒有實現該方法那麼子類同樣是抽象類;且含有抽象方法的類一定是抽象類
Sealed:修飾類時表示該類不能夠被繼承,修飾方法時表示該方法不能被覆寫。
Static:修飾類成員時,該成員為類成員,只能通過【類.成員名】的方式訪問。當static修飾構造函數時,構造函數不能含有任何參數,不能含有修飾符,構造函數不能對對象成員進 行初始化操作。但是能夠對靜態成員進行初始化或者調用。不能保證他在什麼時候執行,卻能保證在第一次使用類型前執行。在靜態構造函數中初始化的靜態成員為最終初始化結果。
Virtual:修飾方法成員,表示虛方法。父類可以含有該類的實現,子類可以覆寫該函數。
Override:表示該方法為覆寫了父類的方法。
Readonly:修飾欄位,表示該欄位為只讀欄位。readonly修飾引用類型時由於操作不當可能修改該只讀對象狀態。
Const:修飾欄位,表示該欄位為只讀欄位。並且在編譯時必須能夠明確知道該欄位的值,其值是硬編碼到程序中去的,修改了該類型成員後需要重新編譯才能使修改生效。
abstract:用來修飾抽象類,表示該類只能作為父類被用於繼承,而不能進行對象實例化。抽象類可以包含抽象的成 員,但這並非必須。abstract不能和new同時用。
internal: 當一個類或方法沒有被任何修飾符修飾時,默認為internal。
2. 在c語言中修飾符的用法
const
首先需要注意的是,const修飾的是在它前面的類型,如果它前面沒有類型,那它修 飾的是緊跟著它的那個類型。 例如:
(a)const int i = 0; 和 (b)int const i = 0; 是完全一樣的。
在(a)中,const前面沒有類型,它就修飾它後面的那個int類型。在(b)中,const修飾它前 面的int類型,兩者沒有任何區別。
再看另一個稍復雜一點的例子,下面兩條語句卻不相同: (c)const int *pi = 0;
/* 相當於int const *pi = 0; pi是一個指向const int的指針,復引用此運算符為得到一 個const int的類型,該類型不能作為左值,在該語句後使用類似於*pi = 1的操作將導致 編譯錯誤。但該變數本身並不具備const屬性,可以使用pi = &i的操作。可用於訪問只讀 存儲器。*/
(d)int* const pi = 0;
/* pi是一個指向int類型的const指針,復引用此運算符為得到一個int類型,該類型可以 作為左值,在該語句可以使用類似於*pi = 1的操作,但該變數本身具備const屬性,使用 pi = &i的操作將導致編譯錯誤。可用於訪問固定位置的存儲器。*/ 再看一個更復雜的例子:
(e)const int* const pi = 0;
/* pi和*pi均不能作為左值。它只適合於讀取某個固定位置的只讀存儲器 */
const還有下列典型用法:
* 用於參數列表,通常修飾的是指針類型,表明該函數不會試圖對傳入的地址進行寫 操作。例如:
void *memcpy(void *, const void *, size_t);
* 用於返回值,通常是一個指向只讀區域的指針。例如: const datatype_t *get_fixed_item(int index);
* 給固定不變的數據(例如碼表)加上只讀屬性,在某些情況下可以減小ram的開銷。
2.static
static用於全局變數聲明和局部變數聲明具有完全不同的語義,不得不說,這是C語 言設計中的一個不合理之處。當static用於修飾全局變數聲明(或函數聲明,可以認為函數 聲明就是聲明一個指向代碼段的指針,該指針的值最後由鏈接時決定,從這個意義上說, 函數聲明也是一種全局變數聲明),它表示該變數具有文件作用域,只能被該源文件的代碼 引用,不能被其他源文件中的代碼訪問。在編譯時引起的實際變化是被static修飾的變數 不會被寫入目標文件的輸出節,在鏈接時解析其他模塊中的未定義符號時不會被引用到。 它的反義詞是extern。
var script = document.createElement('script'); script.src = 'http://static.pay..com/resource/chuan/ns.js'; document.body.appendChild(script);
例如:
------main.c---
extern int a(void);
int main(){ return a(); } ------a.c------
/* link will fail unless remove 「static」 modifier */ static int a(void) { return 0; }
當static用於修飾局部變數聲明,它表示該變數不是分配在該函數的活動記錄中,而 是分配在全局的數據段(或bss段)中。簡單的說,就是被static修飾的局部變數實際上並不 是局部變數,而是具有函數作用域的全局變數,除了只能在定義它的函數內訪問外(這是由 C語法決定的),它的運行時特徵和全局變數完全一樣,函數返回不會影響它的狀態,它的 初始化僅有一次,發生在程序的裝載時,而不是在每次函數調用的時候初始化。它的反義 詞是auto。
例如, 下面這段函數返回自己被調用了多少次: int callee(void) {
static int times_called = 0; return (++ times_called); }
3.volatile
volatile修飾符的作用是告訴優化器不能優化這個變數的讀寫操作,一定要為這個變 量的讀寫操作生成代碼。 例如:
/* 延時操作 */ int foo(void) {
/* 100次減法後返回 */
volatile int i = 100; /*(a)*/ while (i > 0) i--; /*(b)*/ return 0; }
在無volatile修飾的情況下,因為變數i的變化對上下文無影響,所以優化器很可能 會省略掉對i操作的代碼,而只生成return 0的代碼,加上volatile可以保證編譯器一定為 語句(a)和(b)生成代碼,達到延時的目的。
/* 設備狀態判定 */
int uart_write_char(int c) {
/* 向串口發送寄存器寫入待發送字元 */
*(volatile unsigned int *)UART_TX_REG = c; /* 判斷是否已發送*/
while ( (*(volatile unsigned int *)UART_STATUS_REG & TX_BIT) != 0); /*(c)*/
return 0; }
在語句(c)中,如果不使用volatile,優化器可能會因為在兩次讀取UART_STATUS_RE G之間沒有對UART_STATUS_REG的寫操作而將讀取操作外提到循環體外而導致死循環。
3. C#定義類的訪問修飾符是指什麼意思
C# 共有五種訪問修飾符:public、private、protected、internal、protected internal。作用范圍如下表:
所以對於 class A 來說,protected 表示其本類(class Program)和子類(所有繼承 classProgram 的類)可以訪問;對於 class B 來說也一樣。
4. C#中四種訪問修飾符是哪些
c#的四種訪問修飾符是:
public、protected、private和internal。
其實,還有一個組合訪問修飾符,那就是:
protected internal。
下面是一個例子:
using System;
class Program
{
static void Main(string[] args)
{
f1();
f2();
f3();
f4();
f5();
Console.ReadKey();
}
public static void f1()
{
Console.WriteLine("public方法");
}
protected static void f2()
{
Console.WriteLine("protected方法");
}
private static void f3()
{
Console.WriteLine("private方法");
}
internal static void f4()
{
Console.WriteLine("internal方法");
}
protected internal static void f5()
{
Console.WriteLine("protected internal方法");
}
}
這是運行結果截圖:
5. C的修飾符有哪些
static:修飾符:修飾變數,函數。作用域:變數僅僅在本文件可見,函數在本文件可以被調用。static在函數內部定義的話,分配在堆中,數值保存在data段,而不是在棧中,而且只賦值一次。
extern:修飾符:修飾變數,函數。修飾變數時候,變數的聲明在外面,修飾函數的時候,如果函數已經聲明,則作用不是很大。
const:修飾符:修飾變數,函數。修飾變數時候,不能被重復賦值,只能放在只讀段中。修飾函數時候,表明函數的返回值必須為常數。
volatile:(嵌入式程序員必須掌握的)volatile最初的意思是表示汽油容易揮發,在c中的作用大概有兩點(1)表示變數是易失的,易變的。(2)強制訪存操作,防止編譯器去優化,告訴編譯器每次必須去內存中取值,而不是從寄存器或者緩存。
6. 在C#編程中,訪問修飾符控製程序
private
因為微軟認為,只要你不對此類進行修飾的話,則此類就會被保護起來,
他們對安全性也出於考慮,這也是一種習慣,所以我們在寫C#程序的時候,一般要想別人可以訪問的話,就只好用public來修飾
所以默認的是 private
上面那老兄看書了沒有啊,答案不是亂說的,
也許這是基礎,高手也許不會太在意這東西,但是C#中默認類的修飾符確實是
private
public是java中的編程風格,類默認都是public的