【发布时间】:2013-01-24 18:08:52
【问题描述】:
blog entry from Raymond Chen today 让我意识到我遇到的问题的优雅解决方案。
各种shell函数,而不是全部采用ITEMIDLIST结构,可以只接受:
ITEMID_CHILDIDLIST_RELATIVEIDLIST_ABSOLUTEITEMID_CHILD_ARRAY
结构。这些结构都相同,但现在您可以在编译器级别强制执行概念类型。
返回德尔福
我有一组函数:
- 一些只有走一条路:(例如
C:\Users\Ian\Desktop\AllisonAngel.jpg) - 一些仅采用文件名:(例如
AllisonAngel.jpg) - 有些只拿文件夹:(例如
C:\Users\Ian\Desktop)
现在它们都被声明为string,例如:
function GetFilenames(Folder: string; ...): ...
function IsValidBatchFilename(Path: string): ...
function GetReportType(Filename: string): ...
我必须相信我传递的是正确的东西;我相信开发人员(例如 me)知道以下之间的区别:
- 路径
- 文件名
- 和一个文件夹
我想更改函数以使用 "typed" 字符串:
function GetFilenames(Folder: TFolderOnly; ...): ...
function IsValidBatchFilename(Path: TFullPath): ...
function GetReportType(Filename: TFilenameOnly): ...
地点:
type
TFullPath = type string;
TFolderOnly = type string;
TFilenameOnly = type string;
除非没有实际的打字发生:
var
dropFolder: string;
begin
dropFolder := GetDropFolderPath(LCT);
GetFilenames(dropFolder); <-- no compile error
end;
我想要的是一个 "distinct" 类型的字符串;即string,只要它是长度前缀、引用计数、空终止。
【问题讨论】:
-
这就是 Delphi 比较的地方,例如到 C# 是弱的。据我所知,这是不可能的。