匿名方法本质上interface
是一个Invoke
方法:
type
TProc = reference to procedure;
IProc = interface
procedure Invoke;
end;
Run Code Online (Sandbox Code Playgroud)
现在,是否有可能将它们分配给实际的接口变量或将它们作为接口参数传递?
procedure TakeInterface(const Value: IInterface);
begin
end;
var
P: TProc;
I: IInterface;
begin
I := P; // E2010
TakeInterface(P); // E2010
end;
Run Code Online (Sandbox Code Playgroud)
[DCC32错误] E2010不兼容的类型:'IInterface'和'过程,无类型指针或无类型参数'
有很多对象,不能通过接口引用保持活着.因此,它们被包裹在一个封闭物中并被它摧毁,"智能指针":
type
I<T> = reference to function : T;
TInterfaced<T: class> = class (TInterfacedObject, I<T>)
strict private
FValue: T;
function Invoke: T; // Result := FValue;
public
constructor Create(const Value: T); // FValue := Value;
destructor …
Run Code Online (Sandbox Code Playgroud) 这已经被报告为RSP-25603: "Exception.RaiseOuterException can cause wrong W1035 warning"。
鉴于以下(演示)函数F
,我已将异常引发语句更改为现在链异常:
--- before
+++ after
@@ -1,11 +1,11 @@
function F(X: NativeInt): NativeInt;
begin
try
Result := 1 div X;
except
on EDivByZero do
- {ECustom}Exception.Create('...');
+ Exception.RaiseOuterException({ECustom}Exception.Create('...'));
else
raise;
end;
end;
Run Code Online (Sandbox Code Playgroud)
现在,Ctrl-F9
给出警告W1035:
[dcc32 警告]:W1035 函数“F”的返回值可能未定义
但是,所有情况都会处理。编译器无法将其识别Exception.RaiseOuterException
为raise
操作。
不幸的FAcquireInnerException: Boolean
是,Exception
该类是私有的,甚至不能True
在派生的自定义类中设置,我可以继续直接提高 ( raise ECustomException.Create
)。
有什么方法可以让编译器理解,同时保持异常链接?不然我能想到{$Warn No_RetVal Off}
。我还能如何解决这个警告?
我RTTIMethod.Visibility = mvPublic
使用Delphi 10.2 获得(严格)私有记录方法.这是一个错误吗?
更新2017-07-12:创建的问题:RSP-18587.
程序输出显示记录和类的所有实例成员类型和可见性; 从RTTI返回的可见性; 看看对PrivateProcedure
中TSomeRec
:
Types:
Unit1.TSomeRec
Fields:
PrivateField
Visibility: mvPrivate
PublicField
Visibility: mvPublic
Properties:
Methods:
PrivateProcedure
Visibility: mvPublic
PrivateFunction
Visibility: mvPublic
PublicProcedure
Visibility: mvPublic
PublicFunction
Visibility: mvPublic
Unit1.TSomeClass
Fields:
PrivateField
Visibility: mvPrivate
ProtectedField
Visibility: mvProtected
PublicField
Visibility: mvPublic
Properties:
PrivateProperty
Visibility: mvPrivate
ProtectedProperty
Visibility: mvProtected
PublicProperty
Visibility: mvPublic
PublishedProperty
Visibility: mvPublished
Methods:
PrivateProcedure
Visibility: mvPrivate
PrivateFunction
Visibility: mvPrivate
ProtectedProcedure
Visibility: mvProtected
ProtectedFunction
Visibility: mvProtected
PublicProcedure
Visibility: mvPublic …
Run Code Online (Sandbox Code Playgroud) 背景:我遇到的一个应用程序TRegEx
在多个线程中使用了一个单例。单例TRegEx.Create(Pattern, [roCompiled])
在类构造函数中被初始化,线程使用它从 开始RegEx.Match(Value).Groups
,并且似乎没有采用同步机制,但是,应用程序运行良好。尽管如此,这只是TThread.Execute
覆盖的一小部分,并且线程上的负载很小。因此,这可能总是偶然地起作用,因为线程不太可能在关键部分相互交叉。
想法:一方面,考虑一下,一个TRegEx
实例只包含一个不可变(编译)模式并直接处理参数输入是有道理的,或者将此输入保留在 ( TMatch
) 返回值中以供以后可能的继续- - 例如 with NextMatch
,它是在 上TMatch
而不是在 上实现的TRegEx
。并且底层的开源 PCRE 库似乎是线程安全的。所有这些都符合上面的场景。另一方面,我认为一个TRegEx
实例通常不是线程安全的,因为例如,在function TRegEx.Match(const Input: String): TMatch
(如上所用)中,看起来要与模式匹配的字符串在匹配之前首先存储到实例中。和相同的嵌套TPerlRegEx
实例在各种功能链中传递并保持活动状态。TRegEx
例如,共享实例似乎需要防止不协调的访问,例如使用临界区。
也就是说,我怀疑TRegEx不是线程安全的,但我想请教多线程和裁定线程安全的人进行确认。因此,我的问题 - 非常笼统,独立于它演变而来的应用程序:
问题:TRegEx 线程安全吗?
''
)时不返回任何文档,我想知道这是否是一个错误。--- false
,从而引发了空字符串是否实际上是输入的问题。那么,一般来说,空字符串是有效的 YAML 文档吗?
在一个人为的示例中,我有一个支持以下接口的实例:
public interface ISelector<L, R>
{
R Select(L value);
}
Run Code Online (Sandbox Code Playgroud)
现在,我考虑两种调用方式IEnumerable.Select<L, R>(Func<L, R>)
:
IEnumerable<L> l;
ISelector<L, R> selector;
IEnumerable<R> r;
r = l.Select(v => selector.Select(v)); // 1
r = l.Select(selector.Select); // 2
Run Code Online (Sandbox Code Playgroud)
方式 1 将变量对选择器的引用捕获到闭包中,并且该闭包将独立于变量的范围来保存该引用selector
。因此,变量selector
可能会超出范围,并且可能会在变量超出范围r.ToList()
后被调用。selector
但是,我不确定如何理解方式2:如何ISelector<L, R>.Select
分配和捕获?变量是否可以selector
超出范围并可以在变量超出范围r.ToList()
后被调用?selector
就可读性而言,我更喜欢方法 2,但在使用它之前,我想首先了解捕获和垃圾收集部分的生命周期。