【发布时间】:2015-11-08 12:23:51
【问题描述】:
我创建了一个处理数据库访问的库。我最近添加了事务处理;但是,我遇到了一个小问题。为了概述这一点,我编写了这个示例用于演示目的:
class Program
{
static void Main(string[] args)
{
String data = null;
DoAction(ref data, () =>
{
Console.WriteLine(data);
});
Console.ReadLine();
}
private static void DoAction(ref String data, Action action)
{
if (data == null)
data = "Initialized Data";
action();
}
}
我在“数据”变量的以下代码行中得到“访问修改后的闭包”下划线:
Console.WriteLine(data);
我了解修改 ref 数据变量可能会导致问题(例如,在运行 foreach 循环时)。但是,在以下情况下,我认为不会发生这种情况。
这是另一个版本,其中有一个循环进一步更改变量 - 输出符合预期:
class Program
{
static void Main(string[] args)
{
String data = null;
for (var i = 0; i < 10; i++)
DoAction(ref data, () =>
{
Console.WriteLine(data);
});
Console.ReadLine();
}
private static void DoAction(ref String data, Action action)
{
if (data == null)
data = "Initialized Data";
else
data += "|";
action();
}
}
ReSharper 让我可以创建一个局部变量,但我明确希望使用从 DoAction() 方法创建的字符串。如果我接受 ReSharpers 方法,它实际上会破坏代码。有没有其他方法可以解决这个问题?我想使用这种 Action 方法,但我也不希望 ReSharper 抱怨它(并且可能不会禁用 ReSharpers 检查)。
有什么建议吗?
【问题讨论】:
-
我还查看了:Access to Modified Closure (2),其中包含指向原始帖子评论中 ReSharper 文档的链接。