C 無參屬性

2021-12-30 00:39:19 字數 3067 閱讀 2826

大家來討論下c#無參屬性這個東西到底有沒有存在的必要?

永遠不要公開型別的字段,物件導向設計和程式設計的重要原則之一就是 資料封裝。如果公開型別的字段,會很容易的寫出不恰當使用欄位的**。這裡可以把字段宣告為private,然後宣告訪問器方法。

class test

private  string name;

public void setname(string value)

name = value;

public string getname()

return name;

複製**

實現唯讀或只寫就是這麼簡單,不實現乙個索引器方法就行了。還可以將setname方法標記為protected,就可以只允許派生類修改了。聰明的你也發現上面這個做法的缺點了吧,首先得去實現額外的方法,所以會產生更多的**,其次,如果呼叫的時候必須呼叫方法,不能直接引用乙個欄位名。還好c#給我們提供了乙個稱為屬性(property)的機制,它緩解了第乙個缺點造成的影響,也消除了第二個缺點。

class test

private  string name;

public string name

set name = value; }

複製**

屬性可以用任意的可訪問修飾符來標記。不能定義名稱相同的屬性。

如果只是為了封裝乙個支援欄位而建立屬性,c#還提供一一種更簡單的語法,稱為自動實現的屬性(automatically implemented property,簡稱aip)。like this

class test

public int age

get;

set;

複製**

如果宣告乙個屬性而不提供get/set實現,c#會自動為你宣告乙個私有字段。原始**是這樣的:

public int age

[compilergenerated]

getint num;

num = this.k__backingfield;

label_0009:

return num;

[compilergenerated]

setthis.k__backingfield = value;

return;

複製**

和直接宣告乙個public 的age欄位相比,自動實現的屬性的優勢在哪?兩者存在一處重要的區別:使用自動實現的屬性(aip)意味著已經建立乙個屬性,訪問該屬性的時候會呼叫get/set方法。如果有一天你決定自己實現這個aip的get/set,而不接受編譯器預設的實現,那麼訪問這個屬性的任何**都不必重新編譯。如果是乙個public的age欄位,如果你把它更改為屬性,那麼訪問這個欄位的所有**就都需要重新編譯了。

凡事都有好有壞,那麼aip有哪些不討人喜歡的地方呢:

1.如果使用字段宣告的語法,可以包含初始化的部分,如果使用aip就不行了,必須在咩個構造器中顯示的初始化每個aip。

2.aip支援的欄位名是由編譯器決定的,而且每次重新編譯,這個欄位名可能會發生更改,這樣一來,只要含有乙個aip就不能對型別的例項進行反序列化了。在任何想要序列化或反序列化的型別中,都不要使用aip功能。

3.不能在aip的get/set新增斷點,所以不好檢測程式在什麼時候獲取或設定這個屬性。咱手動實現的就可以設定斷點,不信你試試。

aip功能是作用於整個屬性的:要麼都用,要麼都不用,這意味這,如果顯式的實現get那麼set也要顯式實現,反之亦然。

屬性看起來與字段相似,但本質上是方法。屬性與字段的區別如下:

1.屬性可以是唯讀或只寫的(get/set訪問器方法),欄位卻總是可讀可寫的。

2.屬性方法可能丟擲異常,字段訪問不會丟擲。

3.屬性不能作為out或ref引數傳遞給方法,字段可以。

class program

public int age

get

set{}

int age;

static void main()

var t = new ;

test tt = new test();

= "狗剩";

program p = new program();

some(out p.age);

some(out p.age);//屬性,索引器或動態成員不得作為out或ref引數傳遞

console.readkey();

static void some(out int age)

age = 10;

www.2cto.com

4.屬性方法可能花費較長時間執行,欄位的訪問都是立即完成。

5.屬性方法可能需要額外的記憶體,或者返回乙個不正確的引用,指向不屬於物件狀態一部分的某個東西,這樣一來,對返回物件的修改就作用不到原始物件身上了,相反查詢字段返回的總是正確的引用,它指向的東西保證是原始物件狀態的一部分。使用會返回乙個拷貝的屬性時,非常容易引起混淆。

如果仔細研究下屬性和字段的差別,你會發現只有在極個別的情況下屬性才真正有用。屬性唯一的好處就是提供了簡化的語法,和呼叫普通方法(非屬性中的方法)相比,屬性不僅不會提公升**的效能,還會妨礙對**的理解。

屬性訪問器的可訪問性:

我們有時希望為get訪問器指定一種可訪問性,為set訪問器指定另一種訪問器:

class test

public int age

get

protected set }

int age;

複製**

如上所述,age屬性本身宣告為public,意味這get訪問器方法是公共的,可由所有**訪問,但是,注意set訪問器方法被宣告為protected,只能從test的內部定義的**中呼叫,或者從test的派生類的**中呼叫。

定義乙個屬性時,如果兩個訪問其方法需要具有不同的可訪問性,c#語法要求必須為屬性本身指定限制最不大的那一種可訪問性,然後在兩個訪問其中,只能選擇乙個來應用限制較大的那一種可訪問性。在前面的例子中,屬性本身為public,set訪問器為protected(限制比public大)。

class test

private int age

get

protected set }//這裡就通不過編譯

int age;

摘自 小小白白

C 無參屬性

大家來討論下c 無參屬性這個東西到底有沒有存在的必要?永遠不要公開型別的字段,物件導向設計和程式設計的重要原則之一就是 資料封裝。如果公開型別的字段,會很容易的寫出不恰當使用欄位的 這裡可以把字段宣告為private,然後宣告訪問器方法。class test public string getnam...

c 有參方法和無參方法

有參方法 方法是否傳入引數需要根據方法的功能而定,如果方法中需要外部的資料,函式簽名就要宣告為有參的,例如 public void method object obj 然後在方法中使用此obj引數進行運算。無參方法 相對於 有參方法 宣告函式簽名的時候不傳入引數就是了,例如 public void ...

C與C 無參函式的區別

在 c 程式設計思想 關於無參函式宣告,c與c 有很大的差別。在c語言中,宣告int fun1 意味著乙個可以有任意數目和型別的函式 而在c 中,指的卻是乙個沒有引數的函式 下面是乙個c語言的函式和c 的函式驗證了這段話 includeint fun1 int main int fun1 int a...