IDE0059:将值赋给“i”是不必要的

8
这段代码在Visual Studio 2019中生成了信息提示消息: *严重程度 代码 描述 项目文件 行 抑制状态 原因描述 消息IDE0059
不必要地对'i'进行了赋值
避免在代码中进行不必要的值分配,因为这些很可能表示冗余的值计算。如果值计算不是多余的,并且您打算保留赋值,则将赋值目标更改为一个本地变量,其名称以下划线开头,后面可以跟一个整数,例如'_', '_1','_2'等。这些被视为特殊的丢弃符号名称。
代码片段可以正常工作,但我被IDE0059消息所困扰。如果可能的话,我不想抑制它。
    private static XmlDocument LoadXmlFromFile(string xmlPath)
    {
        XmlDocument doc = new XmlDocument();
        int i = 2;
        while (true)
        {
            try
            {
                using (Stream fileStream = System.IO.File.Open(xmlPath, FileMode.Open, FileAccess.Read, FileShare.None))
                {
                    doc.Load(fileStream);
                }

                return doc;
            }
            catch (IOException) when (i > 0)
            {
                i--;
                Thread.Sleep(100);

            }
        }
    }

这里出了什么问题?是假阳性还是我漏掉了什么?
这段代码在 VS2019 中也会产生 IDE0059 警告:
private static XmlDocument LoadXmlFromFile(string xmlPath)
    {
        XmlDocument doc = new XmlDocument();
        int i = 2;
        while (true)
        {
            try
            {
                using (Stream fileStream = File.Open(xmlPath, FileMode.Open, FileAccess.Read, FileShare.None))
                {
                    doc.Load(fileStream);
                }

                return doc;
            }
            catch (IOException)
            {
                if (i == 0)
                {
                    throw;
                }
                i--;
                Thread.Sleep(100);
            }
        }
    }

似乎在抱怨,因为除非出现错误,否则从未使用过变量i。 - BugFinder
i0并且您获得另一个异常时,您希望发生什么? - Herohtar
在catch语句中用if语句替换when。由于您正在返回第一个成功加载的文件,因此while循环是不必要的。我认为使用for()循环会更容易些。 - Glenn van Acker
我只想在i>0时捕获IOExceptions,所有其他异常都应该被抛出。 - Ive
你可以先捕获IOExceptions,然后再添加另一个catch来处理其他异常。但这并不是必要的。如果你只想在i > 0时捕获它们,那就让它倒数到1,然后结束循环。或者你期望i变成负数吗? - Glenn van Acker
显示剩余3条评论
2个回答

3
根据您的描述,似乎您想在通过两个异常时结束睡眠而不抛出警告。我建议您可以使用if语句来实现。
class Program
{
    static void Main(string[] args)
    {
        string path = "D:\\teest1.xml";
        var doc = LoadXmlFromFile(path);
    }
    private static XmlDocument LoadXmlFromFile(string xmlPath)
    {
        XmlDocument doc = new XmlDocument();
        int i = 2;
        while (i>=0)              // change the while sentence
        {
            try
            {
                using (Stream fileStream = System.IO.File.Open(xmlPath, FileMode.Open, FileAccess.Read, FileShare.None))
                {
                    doc.Load(fileStream);
                }

                return doc;
            }
            catch (IOException ex)
            {             
                if (i == 0)
                {
                    throw ex;
                }

                i--;
                Thread.Sleep(200);
            }

        }
        return doc;
    }

}

我对代码没有问题,就我所知道的来看,它似乎工作正常,但是 Visual Studio 产生的这个 IDE0059 消息让我困扰。我不仅想要抑制它,我还想把它弄正确。 - Ive
我没有收到那个警告,请再次检查。 - Jack J Jun
当i == 0时,这段代码不会产生IOException,我需要抛出异常。 - Ive
我已经更新了我的代码,你可以看一下它是否能解决你的问题。 - Jack J Jun
好的,谢谢,这个可以用 :),您可以使用任何为真且消息不存在的条件。 - Ive
1
@Ive 不要使用throw ex,因为它会重置你的调用堆栈。你原本的代码没问题。我不会为了取悦一个有漏洞的编译器而重构我的代码。我遇到了类似的问题,应用VS推荐的更改会破坏我的代码。 - Juan

0

消息IDE0059指示“int i = 2;”的赋值是不必要的。为了节省计算,使用“int i;”。现在i从零(0)开始,并随着“i--;”递减,还要根据代码示例将比较更改为“(i > -2)”和“(i == -2)”。


1
“i”是一个局部变量,因此在使用之前必须明确赋值,否则会出现编译器错误。它不会默认为0。 - Joe Sewell
有很多关于这个的警告,真的很烦人。我可以为每个文件添加一个抑制文件条目,但我找不到关闭此功能的警告。我不想要任何有关我的代码的建议。我希望它能够编译或者不能编译。 - user12228709

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接