常规,我用来判断一个字符串(String,AnsiString,WideString),是不是空的,
一般用 
A:   If str='' thenB:   If Length(str)=0 thenC:   If str[0]=0 then在Delphi6的时候,我习惯用方法A,转到delphi7的时候,我发现有些有潜在问题,就全部改为方法B,方法C我没有用过,只是猜想。现请问,以上的方法在针对不同的字符串的类型,各有什么优缺点,在平台迁移,开发工具版本升迁的时候有什么潜在问题,性能有什么差别?
各位自己习惯用那种方式?

解决方案 »

  1.   

    A 是从String类的重载 = 来实现比较
    B 是调用length函数来判断
    C 是从类的成员来判断 1.从效率上来说,A 不如 B ,B不如C2.从在平台迁移,开发工具版本升迁这方面来说,C不如A,B3.我习惯用B
      

  2.   

    效率 A<B<C
    迁移的问题没有考虑过我在c和delphi中都用B
      

  3.   

    有时候用str='',有时候str.Empty,有时候用Length(str)
    有时候用null
    用好Delphi中的字符串  一:各种字符串 
      字符串是Object Pascal所有数据类型中最有用的类型。许多函数以字符串为传递参数。由于在Delphi中字符串的定义和使用有各种方式,包括Pascal中典型的字符串(String),Delphi支持的长字符串(ANSIString),类似于C语言的字符数组(Array of Char),指向字符的指针(Pchar)等。下面的文章就跟谈谈这些类型在定义和应用中的区别和注意事项。 
    1. 传统的Pascal字符串 
      在Pascal中,典型的字符串是一定长度的字符序列。每一字符串有一设定的长度(缺省值为255),下面是一个例子: 
    Var 
    Address:String; 
    Code:String[50]; 
    Address是一长度为255的字符串,Code的最大长度为50。 
    传统的Pascal字符串长度不能超过255。 
    可以用字符串连接操作"+"把字符串连接在一起: 
    Result:=String1+String2; 
    2. Delphi中的长字符串 
      Delphi除了支持传统的Pascal短字符串还支持长字符串。长字符称为ANSIString。长字符串动态分配内存,即用字符串时才分配字符串所需内存,所以其长度不受限制。在Delphi中你如果用String1:String作类型说明,则String1既可能是短字符串也可能是长字符串,这取决于编译器中$H开关的设置。默认值为$H+,代表ANSI长字符串,VCL中的组件使用ANSI长字符串。长字符串以null结束,这就说明长字符串与C语言中的以null结束的字符串完全兼容。 
    可以通过SetLength函数设置字符串的最大长度: 
    SetLength(String1,100);用TrimLeft,TrimRight和Trim函数分别来消除字符串开头,结尾和首尾的空白区。 
    3. 类似于C的字符数组 
      可以用以0为起点的数组来存储以null结束的字符串。如下定义: 
    Var 
    Name:Array[0..50] of Char; 
    4. Pchar指针 
      如果Delphi中的Exended Syntax 已经设置(缺省值),以0为起点的字符数组就和指向字符的指针Pchar完全兼容,因为以0为起点的字符数组名即指向该字符数组首字符的指针。可以将字符串直接付值给Pchar指针。例如: 
    var 
    P: PChar; 
    begin 
    P := ’Hello world’; 
    end; 
      这样P就指向存储字符串’Hello world’并以null结束的一块内存。 
    许多Windows的应用程序接口API函数要求用Pchar类型作参数。Pchar指针在使用是首先用GetMem(var P: Pointer; Size: Integer)函数申请分配内存,程序结束时用FreeMem(var P: Pointer[; Size: Integer])函数释放内存。例如: 
    Var WinDir,SysDir:Pchar; 
    Begin 
    GetMem(WinDir,256);{为指针分配内存} 
    GetWindowsDirectory(WinDir,128);{将Windows安装目录放至WinDir} 
    ShowMessage(’Windows directory is’+WinDir);{显示结果} 
    End; 
    二:字符串转换 
      以上介绍了Delphi中的四类字符串的定义和使用。由于各类函数对字符串参数类型要求不一,这就需要进行字符串类型转换。 
    1. 可以用StrPas将以null结束的字符串转换为Pascal短字符串。StrpCopy则完成相反的转换。 
    2. 因为长字符串以null结束,所以可以用强制类型转换将长字符串转换成Pchar类型。用法是:Pchar(s),s是一个长字符串。强制类型转换返回一个指向长字符串首字符的指针,并且所指字符串以null 结束。例如: 
    Var 
    Caption,Message:string; 
    Caption:=’Hello World!’; 
    Mssage:=’This is a test of long string’; 
    MessageBox(0,Pchar(Message),Pchar(Caption),MB_OK); 
    小结:在使用Delphi中的字符串时,要时刻清楚该字符串的类型,以免引起混淆。在理解字符串时要把字符串与指针,内存分配联系起来,加强理解。 
     
      

  4.   

    潜在问题不明白,请举个例子
    除非你使用ShortString类型才可以用C
      

  5.   

    我一直用A ;  A最快,  If str='' then 会被编译为汇编码:cmp dword ptr [str],$00B: If Length(str)=0 then 会被编译为一次函数调用,返回字符串长度,不过也很快,常数时间
    C: If str[0]=0 then  其实不合法,编译器不让过,就算过了,也是错误的操作,因为str可能为nil,这样的话,str[0]将直接触发内存异常; 改成If str[1]=0 then  也一样 (string是从1开始索引的)