茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1672090 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
IMG_60D_00077.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

Dot Net? : [轉貼]C# 屬性的設法 (get、set)

發表者 討論內容
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]C# 屬性的設法 (get、set)

(C#) 屬性的設法(get、set)

首先,在OO的世界中,屬性不等於變數位址!

以前寫相關程式時,會直接將屬性寫成(即寫成變數)

public string test;

這個動作將會違反封裝原則。

所以屬性的設計應該用以下方法:

1. (正規做法)
private string a;
public string test
{
set{a=value;}
get{return a;}
}

2. (FrameWork3.5後可用)
public string test { get;set;}


原文出處: (C#) 屬性的設法(get、set) - 阿良筆記- 點部落
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]C# 快速建立自訂類別(Class) 屬性 get & set 精簡程式碼

C# 快速建立自訂類別(Class) 屬性 get & set 精簡程式碼

夜深人靜,非常適合來打一篇對初學者有幫助的教學文!!!

進入正題,如何快速建立自應類別並且定義屬性呢?!

初學者在開發程式時,會嘗試撰寫自己的類別(Class)並且布置自己想要的屬性欄位。

所以初學者可能會這樣撰寫來定義屬性:



publlic class MyClass{
//宣告自定義的字串變數(屬性)
;
//宣告自定義的整數變數(屬性)
int number=1;
//初始化自定義類別
public MyClass(){
}
//設定自定義字串變數
void SetText1(String _Text1){
Text1=_Text1;
}
//取得自定義字串屬性
public String GetText1(){
return Text1;
}
//設定自定義的整數變數
int _number){
number=_number;
}
//取得自定義的整數變數
int GetNumber(){
return number;
}
}

呼叫的方法像這樣



MyClass mc = new MyClass();
mc.SetText1();
String text = mc.GetText1();//取得文字
mc.SetNumber(10);
int number = mc.GetNumber();//取得整數

好的看到這邊你應該也覺得是否要寫的code太多?! 而且事後維護也不太好管理,所以呢又演化了一種新的類別寫法

寫法如下:



class MyClass
{
//宣告自定義的字串變數(屬性)
;
//宣告自定義的整數變數(屬性)
int number = 1;
//初始化自定義類別
public MyClass()
{
}
//設定和取得自定義字串變數
public String Text_Value
{
set { Text1 = value; }
get { return Text1; }
}
//設定和取得自定義整數變數
int Number_Value
{
set { number = value; }
get { return number; }
}
}

使用方法如下:



MyClass mc = new MyClass();
mc.Text_Value = ;
String text = mc.Text_Value;//取得文字
mc.Number_Value = 10;//設定整數
int number = mc.Number_Value;//取得整數



但是到了.Net Framwork 3.0之後 get 和 set 的使用方法已經到了極致啦!!!

類別(Class)寫法如下:



class MyClass{
//宣告自定義的字串變數(屬性)
public String Text1 { get; set; }
//宣告自定義的整數變數(屬性)
int number { get; set; }
//初始化自定義類別
public MyClass()
{
}
}


使用方法如下:



MyClass mc = new MyClass();
mc.Text1 = ;
String text = mc.Text1;//取得文字
mc.number = 10;//設定整數
int number = mc.number;//取得整數



是不是非常的精簡化,而且這樣的寫法日後也比較好管理!!
會不會以後精簡成這樣?! ()

public String sg text;
(誤.......)

都學會了嗎?! 如此一來是不是趕快來改一下以前寫的程式架構,讓程式變得更彈性且容易管理呢?!

文章中的敘述如有觀念不正確錯誤的部分,歡迎告知指正 謝謝
轉載請註明出處

SUKI


原文出處:> C# 快速建立自訂類別(Class) 屬性 get & set 精簡程式碼 - SUKI 開發人蔘- 點部落
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]C# 入門指南 - set 與 get

C# 入門指南 - setget

屬性 (property) 需要有效的封裝 (encapsulation) 到物件 (object) 裡頭,因此類別 (class) 定義屬性時,應該宣告 (declare) 為 private ,也就是私有的,只限所屬類別可以存取,然後另外定義宣告為 publicsetget 方法 (method) ,利用 set 設定屬性,另外用 get 取得屬性值




為什麼要這麼做呢?理由其實很簡單,為了防止物件遭不當的使用,例如

Encrypt t = new Encrypt();
t.cArray = "a"; // 重新將 cArray 設定為另一個字串


Encrypt 型態的變數 t 先以建構子 (constructor) 建立新物件,然後突然將 cArray 重新設定為對另一個字串的參考,這樣一來,原先的對換表格就不見了說,之後加入編碼與解碼的方法,若使用錯誤的表格,就會造成難以回復的結果。雖然這是我們刻意弄的例子,自己寫程式真實情況常常會有打錯字之類的,例如有個屬性 a 原本要設定為 1 ,結果按成 0

t.a = 0; // 把 a 設定錯誤


當然,我們自己開發程式可以自己小心點就好,但是,假如我們開發出的類別有提供給別的程式設計師或開發團隊使用的話,別人就不見得會這麼小心了。因此,物件導向程式設計 (object-oriented programming) 中提供封裝的意義即在此,類別的屬性應該宣告為 private
private string cArray;


setget 都是關鍵字 (keyword) 之一,這裡,我們依 C# 的習慣設置另一個成員 (member) Code ,利用 Code 來存取 cArray ,其中包含 setget 的設定,如下

public string Code {
get { return cArray; }
set {
if (value is string && value.Length == 26) {
cArray = value;
}
else {
System.Console.WriteLine("something worng!!");;
}
}
}


get 很簡單,就只是回傳 cArray , set 比較複雜一點,我們加進型態檢查與字串長度檢查。 value 亦為關鍵字,這是表示指派時等號右邊的值

e.Code = value;


is 為判斷型態相等的關鍵字。 && 後面是字串長度檢查, Length 為字串長度,這裡會判斷 value 是否為 26 ,也就是密碼表的長度。 && 為邏輯運算子 (logical operator) ,也就是說,只有當 value 的型態為字串且字串長度為 26 之時, value 的值會被設定為 cArray 。


這樣的方式雖然還未臻完美,但已經可以有效阻止 cArray 被任意修改。


完整的 Encrypt 修改如下

class Encrypt {
private string cArray;
public string Code {
get { return cArray; }
set {
if (value is string && value.Length == 26) {
cArray = value;
}
else {
System.Console.WriteLine("something worng!!");;
}
}
}
public Encrypt() {
System.Random r = new System.Random();
int a = 0;
int b = 0;
// 限定 a 為偶數
while (a % 2 == 0) {
a = r.Next(1, 10);
b = r.Next(1, 10);
}
System.Console.Write("a: " + a + ", b: " + b + ", ");
int x, y, m;
char c = 'a';
int i;
System.Text.StringBuilder s = new System.Text.StringBuilder();
for (i = 0; i < 26; i++) {
x = c;
y = x * a + b;
m = y % 26;
s.Append((char) (m + 97));
c++;
}
this.cArray = s.ToString();
}
static void Main() {
Encrypt e = new Encrypt();
System.Console.WriteLine("e: "+ e.cArray);
e.Code = "abcdefghijklmnopqrstuvwxyz";
System.Console.WriteLine("e: "+ e.cArray);
e.Code = "abcd";
System.Console.WriteLine("e: "+ e.cArray);
e.Code = "1234";
System.Console.WriteLine("e: "+ e.cArray);
}
}
/* 《程式語言教學誌》的範例程式
http://pydoing.blogspot.com/
檔名:encrypt.cs
功能:示範 C# 程式
作者:張凱慶
時間:西元 2012 年 10 月 */


同樣的, Main() 也有作些修改來測試,編譯執行結果如下





有沒有看到,不符規格的字串無法成功設定 cArray 。好了,接下來,我們替 Encrypt 加入 編碼的功能吧!


中英文術語對照
屬性property
封裝encapsulation
物件object
類別class
宣告declare
方法method
建構子constructor
物件導向程式設計object-oriented programming
關鍵字keyword
成員member
邏輯運算子logical operator


您可以繼續參考
軟體開發


相關目錄
回 C# 入門指南
回 C# 教材
回首頁


參考資料
http://msdn.microsoft.com/zh-tw/library/ms228503%28v=vs.80%29.aspx
http://msdn.microsoft.com/zh-tw/library/ms228368%28v=vs.80%29.aspx
http://msdn.microsoft.com/zh-tw/library/a1khb4f8%28v=vs.80%29.aspx

http://msdn.microsoft.com/zh-tw/library/x9fsa0sw%28v=vs.80%29.aspx
http://msdn.microsoft.com/zh-tw/library/w86s7x04%28v=vs.80%29.aspx
http://msdn.microsoft.com/zh-tw/library/k69wcs43%28v=vs.80%29.aspx

原文出處:程式語言教學誌: C# 入門指南 - set 與 get
前一個主題 | 下一個主題 | 頁首 | | |



Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|