全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2722
推到 Plurk!
推到 Facebook!

請問C# 的get/set ,在DELPHI2005 怎麼表示呢?

答題得分者是:Gordon Li
ATEIN
高階會員


發表:105
回覆:320
積分:125
註冊:2002-07-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-02-18 10:24:46 IP:203.204.xxx.xxx 未訂閱
EX: get{ return ; } set{ } 但D2005 怎麼表示呢? ? 高手,先謝謝您了。 DHM
------
ATEIN
wodahs
初階會員


發表:0
回覆:33
積分:26
註冊:2004-02-26

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-02-18 17:39:47 IP:61.231.xxx.xxx 未訂閱
基本上,這是一個屬性的宣告,所以你可以使用原來Delphi宣告屬性方式來做 property Address: String read get_Address write set_Address; 然後實作get_Address, 以及set_Address 方法 Wodahs
ATEIN
高階會員


發表:105
回覆:320
積分:125
註冊:2002-07-05

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-02-18 18:00:13 IP:203.204.xxx.xxx 未訂閱
您好,在D2005 中的ASP.NET 不台下不能這樣表示。 property Address: String read get_Address write get_Address / set_Address; ERROR MSG:E2186 Field or Method identifier expected 您知道怎麼回事? 但C# 不會有這樣的困擾。 DHM
------
ATEIN
wodahs
初階會員


發表:0
回覆:33
積分:26
註冊:2004-02-26

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-02-18 18:56:40 IP:61.231.xxx.xxx 未訂閱
set_XXX, get_XXX 方法是.net compiler內定保留編譯器會自動產生的屬性存取方法. 你可用不同名稱.可能宣告錯誤吧?! Wodahs 發表人 - wodahs 於 2005/02/18 22:42:32
ATEIN
高階會員


發表:105
回覆:320
積分:125
註冊:2002-07-05

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-02-18 19:09:22 IP:203.204.xxx.xxx 未訂閱
您好: 我對於您的意思不太明白,您可以寫一個例子來做做看嗎? 謝謝您! DHM
------
ATEIN
wodahs
初階會員


發表:0
回覆:33
積分:26
註冊:2004-02-26

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-02-18 22:38:51 IP:61.62.xxx.xxx 未訂閱
補充上面的回答: 基本上你發生的錯誤應該哪裡寫錯,我上一封寫的是凡屬性宣告,經編譯都會產生一組對應的方法set_XXX, get_XXX的方法,如C#的宣告方式: private string _address; public String Address { get { return _address; } set { _address = value; } } 編譯後會自動產生get_Address, set_Address兩個方法. 而在Delphi.NET編譯過也會自動產生那兩個方法.但是有進行轉接 她宣告是 private _address: String; public function get_Address: String; procedure set_Address(const Value: String); property Adddress: String read get_Address write set_Address; 不夠兩者不一樣的是,Delphi.Net經過包過,所以編譯後還是會產生標準的get_Address, set_Address方法(與上面那兩個我們宣告不一樣),而這兩方法會呼叫我們在property裏宣告read/write的函式.裏面的程式有點像 procedure TClass1.set_Adddress(Value: String); //這個是自動產生的,不是我們寫 begin Self.set_Address(Value); //這是呼叫我們宣告的 end; 我待會寫個完整範例給你看. unit InfoLight; interface type TClass1 = class private _address: String; public function get_Address: String; procedure set_Address(const Value: String); { Private Declarations } public constructor Create; property Adddress: String read get_Address write set_Address; end; implementation constructor TClass1.Create; begin inherited Create; // TODO: Add any constructor code here end; function TClass1.get_Address: String; begin Result := _address; end; procedure TClass1.set_Address(const Value: String); begin _address := Value; end; end. 發表人 - wodahs 於 2005/02/18 22:43:24 發表人 - wodahs 於 2005/02/18 23:56:34
ATEIN
高階會員


發表:105
回覆:320
積分:125
註冊:2002-07-05

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-02-20 10:41:44 IP:163.17.xxx.xxx 未訂閱
引言: 補充上面的回答: 基本上你發生的錯誤應該哪裡寫錯,我上一封寫的是凡屬性宣告,經編譯都會產生一組對應的方法set_XXX, get_XXX的方法,如C#的宣告方式: private string _address; public String Address { get { return _address; } set { _address = value; } } 編譯後會自動產生get_Address, set_Address兩個方法. 而在Delphi.NET編譯過也會自動產生那兩個方法.但是有進行轉接 她宣告是 private _address: String; public function get_Address: String; procedure set_Address(const Value: String); property Adddress: String read get_Address write set_Address; 不夠兩者不一樣的是,Delphi.Net經過包過,所以編譯後還是會產生標準的get_Address, set_Address方法(與上面那兩個我們宣告不一樣),而這兩方法會呼叫我們在property裏宣告read/write的函式.裏面的程式有點像 procedure TClass1.set_Adddress(Value: String); //這個是自動產生的,不是我們寫 begin Self.set_Address(Value); //這是呼叫我們宣告的 end; 我待會寫個完整範例給你看. unit InfoLight; interface type TClass1 = class private _address: String; public function get_Address: String; procedure set_Address(const Value: String); { Private Declarations } public constructor Create; property Adddress: String read get_Address write set_Address; end; implementation constructor TClass1.Create; begin inherited Create; // TODO: Add any constructor code here end; function TClass1.get_Address: String; begin Result := _address; end; procedure TClass1.set_Address(const Value: String); begin _address := Value; end; end. 發表人 - wodahs 於 2005/02/18 22:43:24 發表人 - wodahs 於 2005/02/18 23:56:34
看來,DELPHI 還是與先前一樣必需做許多程式碼才行,比起C# 來,煩擾許多。 請問,這是您指的完整範例嗎? DHM
------
ATEIN
wodahs
初階會員


發表:0
回覆:33
積分:26
註冊:2004-02-26

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-02-20 13:15:18 IP:61.62.xxx.xxx 未訂閱
1.對,因為不好意思在開個新Post,所以直接編輯在舊的Post. :) 2.Code的確比較多,不過這是與語言規劃編寫架構相關,Delphi.Net考量傳承之前的開發方式,是Borland於發展Delphi.Net的負荷,但也是對於追隨者的承諾.每種語言編譯改寫成符合CLS的架構的語言,除特別需要(CLS型別轉換支援,限制(pointer, unsafe code),應該會儘量符合原語言的特性,所以,比較程式碼多寡可能比較沒有意義,C語言本來較比較精簡,但過於彈性有時可讀性便變差,如果Delhi.Net改成非常精簡(以Dany的功力輕而易舉),不過這樣一來,向前不相容,使用者還需大量重新學習,與當初CLS訂定的原意有點相悖.其實為了相容,讓開發者盡量沿用原有開發習慣,Delphi.Net研發團隊花了時間定相容架構,寫了一些Helper Class不見得會比重新制定一個新的簡單. 3.範例中其實大部分Code是自動產生,就開發而言,Delphi.Net IDE已盡量簡化Code的動作.真正寫的部份與C# IDE寫的差不多. 像上面的程式碼,寫作方法:(我回去修改上一封註解,請對照看,不另貼,節省網路資源) a.定義Property那行,按ctrl-shit-c產生屬性存取方法的宣告及實作段的框架 b.實作存取方法內容. 不是與C# IDE寫法差不多.所以盡量不要以程式碼多寡決定程式優劣,各撰寫方式各有優缺. 發表人 - wodahs 於 2005/02/20 13:21:52 發表人 - wodahs 於 2005/02/20 13:24:58
ATEIN
高階會員


發表:105
回覆:320
積分:125
註冊:2002-07-05

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-02-20 13:44:42 IP:163.17.xxx.xxx 未訂閱
的確,我想只要學一套pascal 就可以包含了net及非net 或者game 等軟體開發的統合性。真想從c#回到pascal (已經將asp.net 寫成c#版本了)。 您的解答真是清楚,謝謝您的支援。您果然是高手級。 DHM
------
ATEIN
wodahs
初階會員


發表:0
回覆:33
積分:26
註冊:2004-02-26

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-02-20 15:50:10 IP:61.62.xxx.xxx 未訂閱
引言: 的確,我想只要學一套pascal 就可以包含了net及非net 或者game 等軟體開發的統合性。真想從c#回到pascal (已經將asp.net 寫成c#版本了)。 您的解答真是清楚,謝謝您的支援。您果然是高手級。 DHM
您過獎了,我還是菜鳥(在公司裡也是最資淺的),我只是從個人角度提出非正規科班的想法,大家互相討論求進步 :) Wodahs
Gordon Li
一般會員


發表:1
回覆:25
積分:20
註冊:2004-11-15

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-02-21 14:04:30 IP:203.67.xxx.xxx 未訂閱
>看來,DELPHI 還是與先前一樣必需做許多程式碼才行,比起C# 來,煩擾許 >多。請問,這是您指的完整範例嗎? 不需要, 上面的討論不完全正確, 你的C#程式可用下面的Delphi來表示: type TClass1 = class private FAddress: String; { Private Declarations } public constructor Create; property Adddress: String read FAddress write FAddress; Delphi.NET的compiler會自動幫你產生getter和setter, 那就是get_Address和set_Address, 程式師不需要自己宣告和實作.因此上面你們討論的程式: TClass1 = class private _address: String; public function get_Address: String; procedure set_Address(const Value: String); { Private Declarations } public constructor Create; property Adddress: String read get_Address write set_Address; //a.宣告屬性 ,按Ctrl-Shit-C產生g;宣告及實作方法框架 end; implementation constructor TClass1.Create; begin inherited Create; // TODO: Add any constructor code here end; function TClass1.get_Address: String; begin Result := _address; //b.實作屬性Get方法 (即C# get {}段內容) end; procedure TClass1.set_Address(const Value: String); begin _address := Value; //b.實作屬性Set方法 (即C# set {}段內容) end; 是不需要的, 事實上是不太正確的, 因為即使上面宣告了get_Address和set_Address, Delphi.NET compiler仍然會用自己產生的getter和setter, 因此上面的get_Address和set_Address是多餘的. 其實在getter和setter這方面正是我覺得C#比Delphi囉嗦的地方之一,我認為Delphi的syntax比較好.
ATEIN
高階會員


發表:105
回覆:320
積分:125
註冊:2002-07-05

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-02-21 14:53:12 IP:203.204.xxx.xxx 未訂閱
引言: >看來,DELPHI 還是與先前一樣必需做許多程式碼才行,比起C# 來,煩擾許 >多。請問,這是您指的完整範例嗎? 不需要, 上面的討論不完全正確, 你的C#程式可用下面的Delphi來表示: type TClass1 = class private FAddress: String; { Private Declarations } public constructor Create; property Adddress: String read FAddress write FAddress; Delphi.NET的compiler會自動幫你產生getter和setter, 那就是get_Address和set_Address, 程式師不需要自己宣告和實作.因此上面你們討論的程式: TClass1 = class private _address: String; public function get_Address: String; procedure set_Address(const Value: String); { Private Declarations } public constructor Create; property Adddress: String read get_Address write set_Address; //a.宣告屬性 ,按Ctrl-Shit-C產生g;宣告及實作方法框架 end; implementation constructor TClass1.Create; begin inherited Create; // TODO: Add any constructor code here end; function TClass1.get_Address: String; begin Result := _address; //b.實作屬性Get方法 (即C# get {}段內容) end; procedure TClass1.set_Address(const Value: String); begin _address := Value; //b.實作屬性Set方法 (即C# set {}段內容) end; 是不需要的, 事實上是不太正確的, 因為即使上面宣告了get_Address和set_Address, Delphi.NET compiler仍然會用自己產生的getter和setter, 因此上面的get_Address和set_Address是多餘的. 其實在getter和setter這方面正是我覺得C#比Delphi囉嗦的地方之一,我認為Delphi的syntax比較好.
type TClass1 = class private FAddress: String; { Private Declarations } public constructor Create; property Adddress: String read FAddress write FAddress; Delphi.NET的compiler會自動幫你產生getter和setter, 那就是get_Address和set_Address?(這樣表示時,依照您提到,按Ctrl-Shit-C不會產生屬性set/get框架?!)還是有哪裡錯了? 李維 大師,謝謝您 ! DHM
------
ATEIN
wodahs
初階會員


發表:0
回覆:33
積分:26
註冊:2004-02-26

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-02-21 15:18:00 IP:61.231.xxx.xxx 未訂閱
引言: 是不需要的, 事實上是不太正確的, 因為即使上面宣告了get_Address和set_Address, Delphi.NET compiler仍然會用自己產生的getter和setter, 因此上面的get_Address和set_Address是多餘的. 其實在getter和setter這方面正是我覺得C#比Delphi囉嗦的地方之一,我認為Delphi的syntax比較好.
嗯,可能之前我想太多而錯誤考慮詢問者可能有其他的考量,一定要擁有與C#宣告方式等值架構,例設定傳回值需經計算,有事件觸發,設定值檢查等需求等.所以才依C#的架構所寫等值程式,因此使用比較冗長的方式,實際上運作情形,同之前寫文章所述的(以Set Function為例):
引言: 而在Delphi.NET編譯過也會自動產生那兩個方法.但是有進行轉接 她宣告是 private _address: String; public function get_Address: String; procedure set_Address(const Value: String); property Address: String read get_Address write set_Address; 不過兩者不一樣的是,Delphi.Net經過包過,所以編譯後還是會產生標準的get_Address, set_Address方法(與上面那兩個我們宣告不一樣),而這兩方法會呼叫我們在property裏宣告read/write的函式.裏面的程式有點像 procedure TClass1.set_Address(Value: String); //這個是自動產生的,不是我們寫 begin Self.set_Address(Value); //這是呼叫我們宣告的 end;
不過,有一點抱歉的是,我本來雞婆是想跟詢問者說明流程,在例子內把Address多打了一個d區別,結果我自己忘記了 ^^",這樣的缺點是除了Get/Set Function會自動產生外,我們程式還是會另外產生方法,然後於自動產生的程式內很笨的呼叫我們自訂的函式. 所以,如果是沒有額外的需求,可能就如李大師所說方式比較簡單. 其實,如果把名稱改成保留的格式後,set_XXX, get_XXX; Delphi.Net Compiler會以我們程式裡自訂fuction來取代預設的set/get function,這樣就不會產生額外的member function,因為compiler會很聰明,直接替換預設.不會這麼笨會照之前說的流程,編譯產生多餘的程式碼 ^^" 沒說清楚,造成誤解,特此致歉! 謝謝李維大師指教! ^^ wodahs ====================================================================== 我是非出身科班的菜鳥,瞎子摸象,寫錯的地方,請大家包涵包涵,不要太認真 ^^ 歡迎大家批評指教,適時糾正我錯誤觀念,這樣我才會進步並學到正確的知識 ^^ ======================================================================
ATEIN
高階會員


發表:105
回覆:320
積分:125
註冊:2002-07-05

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-02-21 15:28:45 IP:203.204.xxx.xxx 未訂閱
引言:
引言: 是不需要的, 事實上是不太正確的, 因為即使上面宣告了get_Address和set_Address, Delphi.NET compiler仍然會用自己產生的getter和setter, 因此上面的get_Address和set_Address是多餘的. 其實在getter和setter這方面正是我覺得C#比Delphi囉嗦的地方之一,我認為Delphi的syntax比較好.
嗯,可能之前我想太多而錯誤考慮詢問者可能有其他的考量,一定要擁有與C#宣告方式等值架構,例設定傳回值需經計算,有事件觸發,設定值檢查等需求等.所以才依C#的架構所寫等值程式,因此使用比較冗長的方式,實際上運作情形,同之前寫文章所述的(以Set Function為例):
引言: 而在Delphi.NET編譯過也會自動產生那兩個方法.但是有進行轉接 她宣告是 private _address: String; public function get_Address: String; procedure set_Address(const Value: String); property Address: String read get_Address write set_Address; 不過兩者不一樣的是,Delphi.Net經過包過,所以編譯後還是會產生標準的get_Address, set_Address方法(與上面那兩個我們宣告不一樣),而這兩方法會呼叫我們在property裏宣告read/write的函式.裏面的程式有點像 procedure TClass1.set_Address(Value: String); //這個是自動產生的,不是我們寫 begin Self.set_Address(Value); //這是呼叫我們宣告的 end;
不過,有一點抱歉的是,我本來雞婆是想跟詢問者說明流程,在例子內把Address多打了一個d區別,結果我自己忘記了 ^^",這樣的缺點是除了Get/Set Function會自動產生外,我們程式還是會另外產生方法,然後於自動產生的程式內很笨的呼叫我們自訂的函式. 所以,如果是沒有額外的需求,可能就如李大師所說方式比較簡單. 其實,如果把名稱改成保留的格式後,set_XXX, get_XXX; Delphi.Net Compiler會以我們程式裡自訂fuction來取代預設的set/get function,這樣就不會產生額外的member function,因為compiler會很聰明,直接替換預設.不會這麼笨會照之前說的流程,編譯產生多餘的程式碼 ^^" 沒說清楚,造成誤解,特此致歉! 謝謝李維大師指教! ^^ wodahs ====================================================================== 我是非出身科班的菜鳥,瞎子摸象,寫錯的地方,請大家包涵包涵,不要太認真 ^^ 歡迎大家批評指教,適時糾正我錯誤觀念,這樣我才會進步並學到正確的知識 ^^ ======================================================================
加入 set_/get_ 後可以自動產生了,謝謝各位的指教及協助解答。 在此謝謝 李維 大師及wodahs. DHM
------
ATEIN
wodahs
初階會員


發表:0
回覆:33
積分:26
註冊:2004-02-26

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-02-21 15:29:03 IP:61.231.xxx.xxx 未訂閱
引言: type TClass1 = class private FAddress: String; { Private Declarations } public constructor Create; property Adddress: String read FAddress write FAddress; Delphi.NET的compiler會自動幫你產生getter和setter, 那就是get_Address和set_Address?(這樣表示時,依照您提到,按Ctrl-Shit-C不會產生屬性set/get框架?!)還是有哪裡錯了? 李維 大師,謝謝您 ! DHM
Hi, DHM, 1.不好意思,給你的範例Address 多個d. 2.如果是沒有自訂getter/setter function需求,就不用定義set/get function了,這樣編譯時會自己產生取得定義變數的方法. 3.如果有定義自訂的function,可以參考我上一封的回覆.這是我自己亂試在用的,因為我寫的時候有檢查設定值,未出始值處理及事件觸發的壞習慣.所以比較冗長.不過應該有更簡單的方法.如果有時間的話,我再看看文件,可能有比較正統的簡單方法,再跟您報告. ^^ wodahs ====================================================================== 我是非出身科班的菜鳥,瞎子摸象,寫錯的地方,請大家包涵包涵,不要太認真 ^^ 歡迎大家批評指教,適時糾正我錯誤觀念,這樣我才會進步並學到正確的知識 ^^ ====================================================================== 發表人 - wodahs 於 2005/02/21 15:44:07
系統時間:2024-05-13 22:31:30
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!