本软件用于将文本的字符串转换为 Text、Default、Unicode、UTF-8 之间的互相转换,用于文本查询。转换结果使用十六进制表示。
D 语言版不需要特殊的运行库支持。相对于 VB5 版增加了允许输入十六进制的功能,相对于 .net 版减少了一些功能。
对于我自己来说,这是练习使用 D 语言的一个副产品。
程序使用 D 1.015, phobos 和 dfl 开发。
在这一次练习中,发现 D 语言使用上可以和 c# 很类似,比如我写的 HexStringCoding 类,从 c# 复制过来,只修改了几个小地方(如增加 cast,去除 unsafe),就可以正常编译并且正常运行。另外,和 c/dll 的集成也不错,使用 WideCharToMultiByte 之类的系统函数还是很方便的。dfl 大体模仿 .net,所以使用起来很方便。
不过,问题也不少。
比如 bool 类型可以和任何可以转换为 0 和 1 的值进行隐式转换,就是一个语言方面的缺陷。
另外,D 语言选择 char[] 当作字符串来处理,也是一个非常不可理解的事情。char[] 被定义为 utf8,所以如果要对它进行随机检索的话,就需要更多的代码和更差的运行效率,在我看来,utf8 根本不适合作为程序内部处理字符串的编码方案。utf16 才适合。另外,没有 string 类,而用数组来代替 string 的做法也问题多多,除了强类型检测之外,string 类还应该提供相应的字符串处理函数,而不是使用全局函数处理字符串。在我做这个程序的时候,是都使用 utf16 的 wchar[] 来做中间的字符串代替品的,不过,dfl 遵循使用 char[] 的方案,所以,和界面交互的部分也做了转换处理。也许以后可以修改一下 dfl 的代码,使之直接使用 utf16 吧。
另一个问题是,无法使用 obj == null 来判断一个实例是否为空,这个问题不知道别人有没有遇到,或者有什么别的解决方案,我是通过 try catch 的方式处理了,不过感觉很不爽。
另外,还遇到一个问题,基类定义了 abstract 的函数,子类实现了,但是没有使用 override 关键字,编译通过,但是运行结果莫名其妙,加上 override 之后就正常了。这个问题可能造成错误的几率要比上面说的问题大的多,本来,D 应该在这种情况下编译出错才是。
再者,D 的 module 组织方式,感觉是在鼓励大家把所有的类写入一个文件中,实在不是一个好的方式。
对于 dfl,也稍微说一下,它使用了首字母小写的方式,在我看来,既然模仿 .net,就不如模仿个彻底,让大家把 .net 的程序复制过来后,做最少的修改就能编译运行才好 —— 所有首字母改成小写,也是一个不小的工程啊。
Tango 的安装步骤很罗嗦,我还没有试过,不过,嗯,回头还是应该试一下的。