为什么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为TStrings
types的情况通常是代码没有显式创build实例的情况。 例如,一个接收到string列表作为参数的实用程序方法,如果它接受了一个TStrings
,那么任何后代都可以被传递给它。 这是一个简单的例子:
procedure PrintToStdOut(Strings: TStrings); var Item: string; begin for Item in Strings do Writeln(Item); end;
很明显,这个参数被声明为TStrings
而不是TStringList
时有更大的效用。
但是,问题中的代码并不是这种性质,我相信如果sl
被声明为TStringList
types的话,它将会如此温和地得到改进。
TStrings
是一种抽象types,没有实现所有的方法。
TStringList
是TStrings
的后代,实现了所有的function。 在你的代码中,你可以把你的variables声明为TStringList
。
然而,例如在函数定义上,接受TStrings
参数而不是TStringList
是有意义的:
procedure doSomething(lst: TStrings);
这使该函数能够处理TStrings
所有实现,而不仅仅是TStringList
。
因为这样你可以把另一个TStrings
后裔放在SL
variables中(我可能称之为Strings
,而不是SL
)。
在你的情况下,这是没有意义的,因为SL
周围的逻辑包含创build一个TStringList
,没有外部分配或参数parsing。
但是,如果您将逻辑从作业中分离出来,那么您可以从使用任何TStrings
后代中受益。
例如,一个TMemoy.Lines
, TComboBox.Items
, TComboBox.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类的具体实现