为什么variables声明为TStrings并创build为TStringList?

为什么variables声明为TStrings并创build为TStringList

例如:var sl被声明为TStrings但被创build为TStringList

 var sl : TStrings; begin sl := TStringList.Create; // add string values... sl.Add( 'Delphi' ); sl.Add( '2.01' ); // get string value using its index // sl.Strings( 0 ) will return // 'Delphi' MessageDlg( sl.Strings[ 0 ], mtInformation, [mbOk], 0 ); sl.Free; end; 

在我看来,这是毫无意义的,尽pipe完全无害。 你完全可以把sl声明为TStringList ,我总是这样做。 对于代码读者来说,它使局部variables列表更易于理解。

在这个代码中, sl总是被分配一个TStringList实例,所以从声明sl获得TStrings的基类types没有任何好处。 但是,如果您有将各种不同types的TStrings后代分配给variables的代码,则将其声明为TStrings有意义的。

当你可能声明一个variables为TStringstypes的情况通常是代码没有显式创build实例的情况。 例如,一个接收到string列表作为参数的实用程序方法,如果它接受了一个TStrings ,那么任何后代都可以被传递给它。 这是一个简单的例子:

 procedure PrintToStdOut(Strings: TStrings); var Item: string; begin for Item in Strings do Writeln(Item); end; 

很明显,这个参数被声明为TStrings而不是TStringList时有更大的效用。

但是,问题中的代码并不是这种性质,我相信如果sl被声明为TStringListtypes的话,它将会如此温和地得到改进。

TStrings是一种抽象types,没有实现所有的方法。

TStringListTStrings的后代,实现了所有的function。 在你的代码中,你可以把你的variables声明为TStringList

然而,例如在函数定义上,接受TStrings参数而不是TStringList是有意义的:

 procedure doSomething(lst: TStrings); 

这使该函数能够处理TStrings所有实现,而不仅仅是TStringList

因为这样你可以把另一个TStrings后裔放在SLvariables中(我可能称之为Strings ,而不是SL )。

在你的情况下,这是没有意义的,因为SL周围的逻辑包含创build一个TStringList ,没有外部分配或参数parsing。

但是,如果您将逻辑从作业中分离出来,那么您可以从使用任何TStrings后代中受益。

例如,一个TMemoy.LinesTComboBox.ItemsTComboBox.Items
从外面看,它们看起来像是TStrings ,但在内部它们不使用TStringList而是使用自己的后代。

TStrings一些类的例子:

 source\DUnit\Contrib\DUnitWizard\Source\DelphiExperts\Common\XP_OTAEditorUtils.pas: TXPEditorStrings = class(TStrings) source\fmx\FMX.ListBox.pas: TListBoxStrings = class(TStrings) source\fmx\FMX.Memo.pas: TMemoLines = class(TStrings) source\rtl\common\System.Classes.pas: TStringList = class(TStrings) source\vcl\Vcl.ComCtrls.pas: TTabStrings = class(TStrings) TTreeStrings = class(TStrings) TRichEditStrings = class(TStrings) source\vcl\Vcl.ExtCtrls.pas: TPageAccess = class(TStrings) THeaderStrings = class(TStrings) source\vcl\Vcl.Grids.pas: TStringGridStrings = class(TStrings) TStringSparseList = class(TStrings) source\vcl\Vcl.Outline.pas: TOutlineStrings = class(TStrings) source\vcl\Vcl.StdCtrls.pas: TCustomComboBoxStrings = class(TStrings) TMemoStrings = class(TStrings) TListBoxStrings = class(TStrings) source\vcl\Vcl.TabNotBk.pas: TTabPageAccess = class(TStrings) 

TStringList是抽象TStrings类的具体实现