我创建了一个处理数据库访问的库。我最近添加了交易处理;但是,我遇到了一个小问题。为了概括这一点,我写了这个样本用于演示目的:
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检查)。
有什么建议吗?
答案 0 :(得分:2)
如果您确定警告不合适,则InstantHandleAttribute
会被记录为:
告诉代码分析引擎是否完全处理了参数 当被调用的方法在堆栈上时。如果参数是委托, 表示在执行方法时执行委托。 如果参数是可枚举的,则表示它是枚举的 当方法执行时。
我认为这正是你想要的。
您可以从JetBrains.Annotations包中获取该属性,也可以从ReSharper选项中获取复制粘贴。