iT邦幫忙

0

C#的SET與GET

c#

最近在學習C#有一段程式碼是這樣寫
class xx
privede string _a,_b;
public string a
{
get
{
return _a;
}
set
{
_a=value;
}
}
xx yy=new xx();

yy.a="abc" 這時就是執行SET把值傳給_a
console.write(yy.a); 這時就執行GET取_a的值
類別內的可以縮寫成public string a{get;set;}
到這邊我都可以理解但後面的就有問題了
問題一:該程碼直接這樣寫
class xxx{
public int x{get;set;}
public int y{get;set;}
}
其餘部分不重要我就省略了,在最上面的例子有定義一個private _a跟public a對應,但此串程式卻沒定義prvate,那他要get誰的屬性set誰的屬性??。
問題二:是否一定要寫個private _a跟public a來做對應??

問題三:變數是否也應該要寫成一個是_a(有底線)一個a(沒底線)的方式??

外獅佬 iT邦大師 1 級 ‧ 2012-08-15 17:15:09 檢舉
請參考這篇文章:自動實作的屬性
重點在於:自動實作屬性讓屬性宣告更為簡明,而且在屬性的存取子 (Accessor) 中也不需要額外的邏輯。 這些存取子也可以讓用戶端程式碼建立物件。 當您宣告如下列範例所示的屬性時,編譯器便會建立私用 (Private) 的匿名支援欄位,讓您只能透過屬性的 get 和 set 存取子來進行存取。
外獅佬 iT邦大師 1 級 ‧ 2012-08-15 17:18:01 檢舉
也就是說,如同您提供的範例裡頭,宣告private string _a,_b,的動作,以及撰寫get、set存取子的動作,都由compiler幫你自動做好了。
效能不會比較好,但是,就單純的類別屬性設計,這樣比較容易閱讀與維護。

2 個回答

6
pantc328
iT邦研究生 1 級 ‧ 2012-08-08 16:18:05
最佳解答

1.是不用的,如果單純{get;set;} 系統會產生內部的Field 名字是什麼不用知道。因為你只能用Propery 去存取

2.同1說明。是不用的。但如果你要玩複雜的功能,許多的Design Pattern..我都會去建立一個Field來對應

3.命名方式看妳的習慣或看Team的方式
一般的慣例
_Varity
mVarity
varity
我習慣
Field 第一字小寫
Property 第一字大寫
如果Method 有 Parameter 傳值進來
我用
this.varity 去視別Class 的Field varity 代表Parameter

kuanchang iT邦新手 5 級 ‧ 2012-08-08 16:26:15 檢舉

1.抱歉還是不懂,Field是什麼??

3.所以您的意思是說並不一定要_a跟a來對應這只是個人表現方法而已,只是用這樣表示會比較清楚哪個對應到哪個是嗎?

pantc328 iT邦研究生 1 級 ‧ 2012-08-09 20:19:35 檢舉

C#的SET與GET(剩12天到期)
標籤:c#
閱讀(203)點數(10)回答(2)討論(1)取消追蹤(4)收藏(0) 贊助
轉寄
檢舉

最近在學習C#有一段程式碼是這樣寫
class xx
privete string _a,_b;//這叫Field
public string A//叫Property
{
get
{
return _a;
}
set
{
_a=value;
}
}

2

回覆一:

private、public、static 指的是變數、函數、屬性、方法、物件的存取範圍,而不是你所認為的

回覆二:

  1. 第二種應該是 C# 後期的屬性定義方式
  2. 第一種寫法我只在 VB.NET 看過,加底線的那個也有個術語,叫「欄位」
  3. 若沒記錯的話,在 VB.NET 裡面好像要先定義欄位,才能再定義屬性。

回覆三:

  1. 變數是變數,欄位是欄位,屬性是屬性,方法是方法,物件是物件,概念不同。
  2. 加不加底線,應該是取決於你們的 Naming Convention
看更多先前的回應...收起先前的回應...
kuanchang iT邦新手 5 級 ‧ 2012-08-08 16:22:05 檢舉

再回覆一"private、public、static 指的是變數、函數、屬性、方法、物件的存取範圍,而不是你所認為的誰",這個我了解但我問的是對應的問題,如果用get跟set是不是就設定一個pivate一個public,就像我問你怎麼設定一個變數為數值int a=0就這而已這是公式,你卻回答我
int是設定為數值,不一樣的意思!

再回覆二:"1. 變數是變數,欄位是欄位,屬性是屬性,方法是方法,物件是物件,概念不同。
這跟我問的沒關係!!!!
2. 加不加底線,應該是取決於你們的 Naming Convention
所以我才會問對C#來說這是不是他的公式!!!

我的表達的不好嗎怎麼你回答的全部文不對題=="(還是感謝您的回覆)

再回覆二:"1. 變數是變數,欄位是欄位,屬性是屬性,方法是方法,物件是物件,概念不同。
這跟我問的沒關係!!!!

跟你問的沒關係?
在你舉的的例子裡,「_a」就是 pantc328 大所提的 Field,也就是敝人在下小弟我所說的「欄位」,並不是「變數」,所以我的回答並無偏離主題。

  1. 加不加底線,應該是取決於你們的 Naming Convention
    所以我才會問對C#來說這是不是他的公式!!!

你們的命名規範如果認定所有欄位均要加底線,那 _a 這種寫法就是你們的公式

再回覆一"private、public、static 指的是變數、函數、屬性、方法、物件的存取範圍,而不是你所認為的誰",這個我了解但我問的是對應的問題,如果用get跟set是不是就設定一個pivate一個public,就像我問你怎麼設定一個變數為數值int a=0就這而已這是公式,你卻回答我
int是設定為數值,不一樣的意思!

我完全看不到你哪邊有在問「如何設定一個變數為數值」
因為在你舉的例子裡,那些東西根本就不是變數

kuanchang iT邦新手 5 級 ‧ 2012-08-09 14:05:15 檢舉

1."你們的命名規範如果認定所有欄位均要加底線,那 _a 這種寫法就是你們的公式",就是因為不知道是不是規定要這樣寫我才會問的阿

2."我完全看不到你哪邊有在問「如何設定一個變數為數值」",我並沒有問這個,這只是我舉例你所回答我的答案跟我問的不一樣

2."我完全看不到你哪邊有在問「如何設定一個變數為數值」",我並沒有問這個,這只是我舉例你所回答我的答案跟我問的不一樣

那只好請你原諒我說重話了
麻煩想清楚自己的問題到底是什麼
再來發問

kuanchang iT邦新手 5 級 ‧ 2012-08-10 11:19:33 檢舉

那我也只好講重話了,如果看不懂問題也請勿亂回答

ted99tw iT邦高手 1 級 ‧ 2012-08-10 13:56:51 檢舉

看熱鬧的也要說重話了,....這問題到底重在那裏...可否重重地說一下....毆飛

kuanchang 說:
那我也只好講重話了,如果看不懂問題也請勿亂回答

該吐的草我都吐了,請看清楚,問題不在我。

ted99tw 說:
看熱鬧的也要說重話了,....這問題到底重在那裏...可否重重地說一下....

請問古文大師的大作,發表完了沒?還沒的話,就先忙您自己的去吧。

我要發表回答

立即登入回答