访问修改后的闭包:ReSharper

时间:2015-08-15 10:16:01

标签: c# c#-4.0 resharper

我创建了一个处理数据库访问的库。我最近添加了交易处理;但是,我遇到了一个小问题。为了概括这一点,我写了这个样本用于演示目的:

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检查)。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

如果您确定警告不合适,则InstantHandleAttribute会被记录为:

  

告诉代码分析引擎是否完全处理了参数   当被调用的方法在堆栈上时。如果参数是委托,   表示在执行方法时执行委托。   如果参数是可枚举的,则表示它是枚举的   当方法执行时。

我认为这正是你想要的。

您可以从JetBrains.Annotations包中获取该属性,也可以从ReSharper选项中获取复制粘贴。