日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

新時代的開端:DELPHI.NET- 語言篇

發(fā)布時間:2025/7/14 asp.net 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 新時代的開端:DELPHI.NET- 語言篇 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

新時代的開端:DELPHI.NET- 語言篇

新時代的開端:DELPHI.NET- 語言篇
文/黃忠成(2004/1/1,原文刊登於PC 電腦傳真月刊)
DELPHI.NET
在經(jīng)過近兩年的漫長等待後,Borland 終於在2003 年的耶誕前夕釋出了DELPHI 8
for .NET Framework 的正式版本,此舉不但粉碎了DELPHI 已死的揣測,也正式將DELPHI
使用者帶入了.NET 的世界。藉由VCL.NET,原DELPHI 使用者可以延用以往所開發(fā)的
元件或是程式,用幾乎相同的方式撰寫.NET Windows Application。除此之外,
DELPHI.NET 也支援.NET WinForm 及ASP.NET 的應(yīng)用程式開發(fā),這就像是DELPHI 一
貫的傳統(tǒng):支援最多的環(huán)境,提供多樣化的開發(fā)技術(shù),讓使用者得到最大的應(yīng)用空間。
當(dāng)然,不可否認(rèn),DELPHI.NET 畢竟是一個新的開發(fā)環(huán)境及一個加強(qiáng)後的DELPHI 語言,
要說完全無痛升級是不可能的,程式設(shè)計師應(yīng)該要有一個認(rèn)知,在Windows 時代,API
是不可缺的知識,在今日的.NET 時代也不例外,了解.NET Framework 是基本的要求。
針對DELPHI.NET 所提供的各種新功能及新語言特色,筆者規(guī)畫了一系列文章,希望
能幫助原DELPHI 的使用者快速的進(jìn)入DELPHI.NET 的世界,現(xiàn)在就讓我們開始這一趟
旅程吧。
Imporved! Namespace(命名空間)
事實上,Namespace 並非是在DELPHI.NET 中第一次出現(xiàn),早在DELPHI 時代就已具
備基本的Namespace 概念,只是當(dāng)時此技術(shù)尚未成熟,大多數(shù)時候只是用來解決模糊呼
叫或是定義等問題,下面的程式碼片段是在DELPHI 時代使用該技術(shù)的範(fàn)例。
Dialogs.ShowMessage(AMsg);
當(dāng)時,這種技術(shù)頂多只能稱之為Unit 的分割,離真正的Namespace 尚有段距離。為了
符合CLS 規(guī)格,DELPHI.NET 加入了真正的Namespace 機(jī)制,使編譯後的Assembly 能
為其它CLS 相容語言所用,其基本用法與以往大致相同。
unit MyCompany.MyProduct.Unit2;
interface
uses Borland.Vcl.Classes,Borland.Vcl.SysUtils;
與DELPHI 相同,DELPHI.NET 的Unit 檔名需與unit ...部份同名,另外原先的Classes、
SysUtils 等Unit 也都納入了Borland.Vcl 這個Namespace 之中,不過使用者並不需特別
修改以往的程式來符合這個改變,藉由編譯器預(yù)設(shè)Namespace 搜尋功能,使用者仍可使
用uses Classes,SysUtils 方式來處理,編譯器自會代為轉(zhuǎn)換。提醒讀者,目前DELPHI.NET
仍只支援在一個Unit 中定義單一Namespace,並不允許同一Unit 擁有多個Namespace。
另外DELPHI.NET Unit 也不支援類似C#等語言中以明確定義代替uses 的方式,簡單的
說就是要引用Unit2 才能使用其中的定義,不能省略掉引用Unit2 部份,直接使用
Unit2.xxx 方式宣告。
New! 成員視界
在DELPHI.NET 中,除了原有的private、protected、public、published 四個視界外,還
加入了strict private、strict protected 兩個新的成員視界,此舉是為了符合CLS 規(guī)格。原先
的DELPHI 中,private、protected 在同一Unit 中是被視同為public 視界的,下面的程式碼
說明了此點。
type
TMyClass = class
private
FData:Integer;
end;
...............
vObj := TMyClass.Create;
vObj.FData := 100; //OK!
這個特性仍被延用至DELPHI.NET,事實上它們被對應(yīng)至Assembly or Family、Assembly
and Family 兩個CLS 所規(guī)範(fàn)的視界,而strict private 及strict protected 則對應(yīng)到真實的
private、protected 兩個視界,表一列出目前DELPHI.NET 的視界對應(yīng)及存取限制。
TMyClass = class
strict private
FPrivateData:Integer;
private
FData:Integer;
end;
.............
vObj := TMyClass.Create;
vObj.FData := 100; //OK
vObj.FPrivateData := 100; //Error
DELPHI.NET C# CLS 說明
private internal Assembly 該類別或同一Assembly 才可存取。
protected internal protected Assembly or Family 同一Assembly 或子類別才可存取。
public public Public 不限。
strict private private Private 該類別中才可存取。
strict protected protected Family 該類別及其子類別才可存取。
New! class var(靜態(tài)成員變數(shù))
對DELPHI 使用者來說,靜態(tài)成員變數(shù)是個新功能,以往多是以全域變數(shù)來達(dá)到相同
效果,使用靜態(tài)成員可以有效的將設(shè)計師由全域變數(shù)的窠臼中解放。
TMyClass = class(TObject)
class var
InstanceCount:Integer;
..................
constructor TMyClass.Create;
begin
TMyClass.InstanceCount := TMyClass.InstanceCount+1;
inherited Create;
end;
destructor TMyClass.Destroy;
begin
TMyClass.InstanceCount := TMyClass.InstanceCount-1;
inherited Destroy;
end;
..................
TMyClass.Create;
TMyClass.Create;
TMyClass.Create;
ShowMessage(IntToStr(TMyClass.InstanceCount)); // 3.
class var 與一般成員相同,也具備了視界的觀念。
New! static member function(靜態(tài)成員函式)
事實上,DELPHI 中早就具備了靜態(tài)成員函式的功能,當(dāng)時稱為class method,
DELPHI.NET 除了繼續(xù)延用此概念外,還加入了static method 的支援,這點主要是針對
CLS 的規(guī)格而定。但是目前On-Line Help 在描述語法時似乎有誤,其內(nèi)的範(fàn)例是在一般
的method 後加上static 即可成為靜態(tài)成員函式,但實際上編譯器並不接受此語法,在筆
者觀察VCL 的原始碼後,正確的用法應(yīng)該如下所示。
TMyClass = class(TObject)
class var
InstanceCount:Integer;
public
...............
class procedure ShowInstanceCount; static;
end;
class procedure 是否加上static 的關(guān)鍵字,會影響編譯器所產(chǎn)生的IL 程式碼,假如設(shè)計
者希望該函式能為其它CLS 相容語言所用,就必須加上static 關(guān)鍵字。
New! static properties(靜態(tài)成員屬性)
這也是一個全新的功能,DELPHI.NET 允許設(shè)計師定義靜態(tài)的成員屬性,其唯一限制
是在屬性的存取函式或是變數(shù)都必須是靜態(tài)成員。
TMyClass = class(TObject)
strict private
class procedure SetData(AData:Integer);static;
class function GetData:Integer;static;
class var
FData : Integer;
public
class property Data:Integer read GetData write SetData;
end;
.........
TMyClass.Data := 100;
ShowMessage(IntToStr(TMyClass.Data)); //100
New! static construtcor(靜態(tài)建構(gòu)子)
在DELLPHI.NET 中,靜態(tài)建構(gòu)子(class constructor)可用來初使化靜態(tài)成員。
TMyClass = class(TObject)
class var
FDataVar : Integer;
public
class constructor Create;
end;
..............
class constructor TMyClass.Create;
begin
FDataVar := 1000;
end;
......
ShowMessage(IntToStr(TMyClass.FDataVar)); // 1000
基本上,DELPHI.NET 提供了完整的靜態(tài)成員支援,而其是由原本的class member 所延
伸而來。
New! Nested Type(巢狀型別)
這也是為了符合CLS 所添加的新功能,DELPHI.NET 允許設(shè)計師在某個類別中定義
一個子類別,需注意的一點是DELPHI.NET 的Nested Type 並不受視界影響,即使將子
類別宣告於strict private 之中,實際上所編譯出來的仍然是public。不過設(shè)計師仍可延用
以往將類別宣告於implementation 區(qū)段後的方式來達(dá)到與private 相同效果。
TMyClass = class(TObject)
public
type
TMyClassInner = class(TObject)
public
FData:Integer;
end;
strict private
FInner : TMyClassInner;
.....................
var
vObj2 : TMyClass.TMyClassInner;
begin
vObj2 := TMyClass.TMyClassInner.Create;
..................
New! Sealed Classes(末代類別)
在CLS 規(guī)格中允許設(shè)計者定義一個seled class,此種類別將不支援繼承,DELPHI.NET
同時也支援了此功能。不過,DELPHI.NET 的on-line help 對此語法的描述是錯誤的,
下面是正確的語法。
TMyClass = class sealed
public
procedure HelloMyClass;
end;
TMyClass2 = class(TMyClass) //Error!
New! Operator Overload(運算子覆載)
運算子覆載對於DELPHI 設(shè)計師來說是一個完全嶄新的概念,藉由此功能的幫助,設(shè)
計師可以自定類別的運算子行為,提供使用者一個較直覺的應(yīng)用模式,例如用”+”符號
直接加總兩個物件實體,或是改變物件的型別轉(zhuǎn)換行為,下面的程式展現(xiàn)了此類運用。
TMyClass = class
strict private
FData:Integer;
public
class operator Add(A,B:TMyClass):TMyClass;
class operator Implicit(A:Integer):TMyClass;
class operator Implicit(A:TMyClass):Integer;
property Data:Integer read FData write FData;
end;
...................
class operator TMyClass.Add(A,B:TMyClass):TMyClass;
begin
Result := TMyClass.Create;
Result.Data := A.Data + B.Data;
end;
class operator TMyClass.Implicit(A:Integer):TMyClass;
begin
Result := TMyClass.Create;
Result.Data := A;
end;
class operator TMyClass.Implicit(A:TMyClass):Integer;
begin
Result := A.Data;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
vObj1,vObj2,vResult,vResult2:TMyClass;
vInt:Integer;
begin
vObj1 := TMyClass.Create;
vObj2 := TMyClass.Create;
vObj1.Data := 100;
vObj2.Data := 100;
vResult := vObj1 + vObj2;
ShowMessage(IntToStr(vResult.Data));
vInt := vResult;
ShowMessage(IntToStr(vInt));
vResult2 := vInt;
ShowMessage(IntToStr(vResult2.Data));
end;
程式中只展示了隱含轉(zhuǎn)型的覆載,DELPHI.NET 也支援明確轉(zhuǎn)型的覆載,只要將Implicit
改為Explicit 即可。DELPHI.NET 的運算子覆載技術(shù)完全相容於CLS 規(guī)格,其它支援運
算子覆載的CLS 語言,如C# 皆可直接引用。不過設(shè)計師為此特色興奮之餘,也不能忘
記一點,運算子覆載是個相當(dāng)嚴(yán)肅的課題,當(dāng)覆載了”+”符號之後,若不覆載其它運算
符號,將令使用者感到困惑,這也是運算子覆載容易造成錯誤的原因。
New! class helper
這不僅是一個全新的功能,同時也是一個嶄新的概念,DELPHI.NET 為了達(dá)到整合
VCL.NET 與.NET Framework 的目的,加入了class helper 功能,運用此功能,設(shè)計者可
以在不改變既存類別原始設(shè)計的方式,延伸該類別,即使該類別是末代類別也不例外,
下面是一個簡單的範(fàn)例。
TMyClass = class sealed
public
procedure HelloMyClass;
end;
TMyClassHelper = class helper for TMyClass
public
procedure HelloMyClassHelper;
end;
..........
procedure TMyClass.HelloMyClass;
begin
ShowMessage('Hello My Class!');
end;
procedure TMyClassHelper.HelloMyClassHelper;
begin
ShowMessage('Hello My Class Helper!');
end;
...............
var
vObj : TMyClass;
begin
vObj := TMyClass.Create;
vObj.HelloMyClass;
vObj.HelloMyClassHelper;
end;
熟悉Design Patterns 的讀者應(yīng)該已發(fā)現(xiàn),class helper 有點類似Adapter 及Helper 這兩個
Pattern,是的!基本上class helper 就是這兩個Pattern 的演化,只是DELPHI.NET 採取編
譯器角度來實作,並將細(xì)節(jié)隱藏。class helper 也支援繼承與虛擬函式的操作,這代表著
class helper 開啟了除繼承外的另一扇延伸之窗,下面的範(fàn)例展示了此種用法。
TMyClassHelper = class helper for TMyClass
public
procedure HelloMyClassHelper;virtual;
end;
TMyClassHelper2 = class helper(TMyClassHelper) for TMyClass
public
procedure HelloMyClassHelper;override;
end;
需特別注意的一點,因為class helper 的實作方式較一般class 不同,因此不支援strict
private、strict protected 這兩個視界,同時也不能擁有成員變數(shù),只允許靜態(tài)成員變數(shù)。
class helper 底層運作
相信有些讀者一定對於class helper 內(nèi)部的實作方式很好奇,筆者也是,所以利用了
ILDASM 及DeCompiler 工具來觀察使用class helper 類別的實作,事實上,class helper
最終的實作碼大致與下面的DELPHI 程式碼相同。
TMyClass = class
public
FData:Integer;
end;
TMyClassHelper = class
public
class procedure ShowData(ASelf:TMyClass);
end;
class procedure TMyClassHelper.ShowData(ASelf:TMyClass);
begin
ShowMessage(IntToStr(ASelf.FData));
end;
procedure TForm1.Button1Click(Sender: TObject);
var
vObj : TMyClass;
begin
vObj := TMyClass.Create;
vObj.FData := 100;
TMyClassHelper.ShowData(vObj);
end;
其技術(shù)重點在於將class helper 中的函式編譯為靜態(tài)函式,並添加了一個參數(shù),用來傳入
helped object。在呼叫端部份的程式碼則會被展開為呼叫該靜態(tài)函式,這些行為都是由
編譯器代勞,下面的程式可以證明這個論點。
procedure TForm1.Button1Click(Sender: TObject);
var
vObj : TMyClass;
vType : System.Type;
Methods : array of MemberInfo;
begin
vObj := TMyClass.Create;
vObj.HelloMyClass;
vObj.HelloMyClassHelper;
{ invoke static function of TMyClassHelper }
vType := TypeOf(TMyClassHelper);
vType.InvokeMember('HelloMyClassHelper',BindingFlags.InvokeMethod,Nil,Nil,[vObj]);
end;
當(dāng)class helper 含有繼承時,其行為會稍微改變,改採Interface 來處理,由於這個課題還
牽扯到了RTL 部份,礙於篇幅,筆者就不再深入討論了。
PS:InvokeMember 是.NET Reflection 功能的一部份,其功能是由某個型別取出其方法並
呼叫,筆者將其放在下一篇:.NET Framework 中一併討論。
Next,.NET Framework 篇
本篇文章中,筆者以快速的方式引領(lǐng)讀者瀏覽DELPHI.NET 所新增的語言特色,不過
由於篇幅有限,實難詳述每個特色,例如record 中能定義成員函式等較少用到的功能就
被省略了,讀者們可以參考o(jì)n-line help 來得到筆者所省略掉的其它細(xì)節(jié),下次再見了!

轉(zhuǎn)載于:https://www.cnblogs.com/fuyingke/archive/2005/08/06/209110.html

總結(jié)

以上是生活随笔為你收集整理的新時代的開端:DELPHI.NET- 語言篇的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。