作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
从D2007转换到XE2,我转换了这个函数
function Add_Line( FileStream : TFileStream; ALine : string) : boolean;
至
function Add_Line( FileStream : TFileStream; ALine : string; Enc: TEncoding = nil) : boolean;
var
AStr: ANSISTring;
begin
Result := True;
if Enc = nil then Enc := TEncoding.ANSI;
try
//Old FileStream.WriteBuffer( Pointer(ALine)^, Length(ALine) );
if Enc = TEncoding.UTF8 then
AStr := UTF8Encode(ALine)
else
AStr := ANSIString(ALine);
FileStream.WriteBuffer( AStr[1], Length(ALine) );
end;
except
Result := False;
end;
end;
理由:
尽可能少地使用 Add_Line 更改代码
接受自动更改为 Unicode,仅在最后一刻写入 8 位文本文件(这在 XML 和 CSV 中使用)。如果需要的话,将来我们仍然可以转向 UTF-16 文件。
我想定义类似的东西:
function Add_Line( FileStream : TFileStream; ALine : string; Enc: TEncoding = TEncoding.ANSI) : boolean;
但是编译器提示;-)
这样的事情可能吗?
最佳答案
默认参数必须是编译时常量,但如果您需要更高级的内容,可以创建重载:
function Add_Line( FileStream : TFileStream; ALine : string) : boolean; overload;
function Add_Line( FileStream : TFileStream; ALine : string; Enc: TEncoding) : boolean; overload;
function Add_Line( FileStream : TFileStream; ALine : string) : boolean;
begin
Result := Add_Line(FileStream, ALine, TEncoding.ANSI);
end;
您甚至可以添加 inline
关键字来获取与默认参数有效时生成的代码完全相同的代码。
注意:除了 TEncoding.ANSI
和 TEncoding.UTF8
之外,您似乎不支持任何其他内容。在这种情况下,TEncoding
参数似乎太过分了,您可以使用 UTF8: Boolean
参数代替(或者重新编写代码以使用任意编码的 CodePage
).
注释 2:FileStream.WriteBuffer( AStr[1], Length(ALine) );
是错误的,因为 Length(ALine)
和 Length(AStr)
不必相同,您应该使用 Length(AStr)
代替。此外,当 AStr
为空字符串时,AStr[1]
可能会导致异常,您可以添加一种特殊情况,仅在以下情况下调用 WriteBuffer
: AStr
不为空。
关于delphi - 如何为 TEncoding 类型的函数参数设置默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12352152/
我是一名优秀的程序员,十分优秀!