Delphi For Android 开发笔记 2 NEXTGEN下的字符串类型
2015-01-28 10:50
543 查看
delphi开发速度迅捷至少有30%(猜的,呵呵)的原因是因为其字符串(string、WideString、PChar、PAnsiChar等)处理能力。
而从delphi XE4开始,在system等单元中,出现了一个叫 NEXTGEN 的编译条件,这条件是在进行移动开发时自动定义的,而传统桌面开发时没有定义NEXTGEN。
这个编译条件直接导致原来的PAnsiChar、AnsiString无法使用(传统桌面开发没有影响),只要稍微接触深入,即可发现,其实并不是无法使用,字符串类型新增了如下定义:
其中带下划线开头的“_XXXX”的定义属于内部定义,无法直接使用,而我们也可以看出原来的PAnsiChar定义为_PAnsiChr,而_PAnsiChr则统一定义为MarshaledAString,也就是说,原来使用PAnsiChar的函数,其实可以使用MarshaledAString代替,不过这样是一种折中的做法,毕竟谁也不知道以后的变化,能用PChar和string就尽量用吧。
实际使用中也确实没有什么影响,但是在多平台开发中,为何delphi将原来的PAnsiChar去掉,使用MarshaledAString呢,其实在java、.NET中,已经很早就有这类托管的数据类型了,只是作为传统的delphi桌面开发人员,并不熟悉也不太想去熟悉,而使用托管的字符串数据类型一方面是实现内存的自动回收管理,另一方面也是方便各种字符串编码的转换。
个人认为,在Windows系列PAnsiChar就是Ansi编码,而在unix系列的PAnsiChar应该都是Utf8编码,作为跨平台开发语言,需要尽量屏蔽这种差异。
相信delphi XE系列的目标是将所有平台的字符串类型转换为string(即UnicodeString),只要使用VLC的函数,即可不关心当前平台的字符串类型,这种做法也将慢慢的屏蔽掉AnsiString,WideString等写法,而全部统一PChar和string(内部其实是PWideChar和UnicodeString)。
想法和做法都是对的,只是很多时候对开发人员来说是无奈的,毕竟很多操作系统的特殊功能是无法通过封装去实现无缝移植的。
关于字符串的变化,甚至导致classes中的BinToHex和HexToBin函数出现相当麻烦的变化,有兴趣的朋友可以去看看。
字符串相关的处理也出现了很多新的类型:
1) TMarshaller :作为新字符串类型的转换类(其实是record,但是现在Record和Class其实功能上差别已经很小),可将string转换为ANSI、UTF8等
2) TStringBuilder:各种字符串处理功能,添加、比较、插入、转换等
待续...
而从delphi XE4开始,在system等单元中,出现了一个叫 NEXTGEN 的编译条件,这条件是在进行移动开发时自动定义的,而传统桌面开发时没有定义NEXTGEN。
这个编译条件直接导致原来的PAnsiChar、AnsiString无法使用(传统桌面开发没有影响),只要稍微接触深入,即可发现,其实并不是无法使用,字符串类型新增了如下定义:
{$IFDEF NEXTGEN} _ShortStr = _ShortString; _AnsiStr = _AnsiString; _AnsiChr = _AnsiChar; _WideStr = _WideString; _PAnsiChr = _PAnsiChar; {$ELSE} _ShortStr = ShortString; _AnsiStr = AnsiString; _AnsiChr = AnsiChar; _WideStr = WideString; _PAnsiChr = PAnsiChar; {$ENDIF} MarshaledString = PWideChar; MarshaledAString = _PAnsiChr;
其中带下划线开头的“_XXXX”的定义属于内部定义,无法直接使用,而我们也可以看出原来的PAnsiChar定义为_PAnsiChr,而_PAnsiChr则统一定义为MarshaledAString,也就是说,原来使用PAnsiChar的函数,其实可以使用MarshaledAString代替,不过这样是一种折中的做法,毕竟谁也不知道以后的变化,能用PChar和string就尽量用吧。
实际使用中也确实没有什么影响,但是在多平台开发中,为何delphi将原来的PAnsiChar去掉,使用MarshaledAString呢,其实在java、.NET中,已经很早就有这类托管的数据类型了,只是作为传统的delphi桌面开发人员,并不熟悉也不太想去熟悉,而使用托管的字符串数据类型一方面是实现内存的自动回收管理,另一方面也是方便各种字符串编码的转换。
个人认为,在Windows系列PAnsiChar就是Ansi编码,而在unix系列的PAnsiChar应该都是Utf8编码,作为跨平台开发语言,需要尽量屏蔽这种差异。
相信delphi XE系列的目标是将所有平台的字符串类型转换为string(即UnicodeString),只要使用VLC的函数,即可不关心当前平台的字符串类型,这种做法也将慢慢的屏蔽掉AnsiString,WideString等写法,而全部统一PChar和string(内部其实是PWideChar和UnicodeString)。
想法和做法都是对的,只是很多时候对开发人员来说是无奈的,毕竟很多操作系统的特殊功能是无法通过封装去实现无缝移植的。
关于字符串的变化,甚至导致classes中的BinToHex和HexToBin函数出现相当麻烦的变化,有兴趣的朋友可以去看看。
字符串相关的处理也出现了很多新的类型:
1) TMarshaller :作为新字符串类型的转换类(其实是record,但是现在Record和Class其实功能上差别已经很小),可将string转换为ANSI、UTF8等
2) TStringBuilder:各种字符串处理功能,添加、比较、插入、转换等
待续...
相关文章推荐
- Delphi For Android 开发笔记 1 - 开发工具介绍
- Delphi For Android 开发笔记-附:如何Delphi中同时实现Windows、Android版的GetModuleFileName函数
- Android开发笔记--操纵字符串中的字符
- 【Android平台】 Alljoyn学习笔记三 开发环境的搭建和Building AllJoyn from Source for Android
- Android开发笔记——常见BUG类型之内存泄露与线程安全
- Android应用开发学习笔记之startActivityForResult
- DELPHI XE Android 开发笔记
- android开发过程中将json日期字符串,转换成JAVA中Date类型格式化字符串
- Kotlin开发Android笔记5:Anko for Android
- #iOS开发笔记#未找到应用程序的“aps-environment”的授权字符串/“no valid aps-environment entitlement found for application
- C\C++ 程序员从零开始学习Android - 个人学习笔记(四) - java基础 - 数据类型、变量、字符串、数组
- Mono for Android开发调研笔记
- php开发笔记(三)字符串(string)类型中单双引号使用的注意事项
- Android开发笔记——SharedPreferences 存储实体类以及任意类型
- Android开发笔记(四)字符串格式化
- Javascript学习笔记-1(类型、变量、for语句、数组、字符串、原型对象、函数对象)
- Android开发之--将时间字符串转化成Date类型或反转
- Android开发笔记(三)可以改变的字符串SpannableString
- Mono for Android开发调研笔记
- Android 开发笔记 第二季 startActivityForResult