繁体   English   中英

为什么这个程序只产生三个警告?

[英]Why does this program only produce three warnings?

public class Program
{
     public static void main(String[] args)
     {
         string message = "This is a message";
         int number = 6;
         object obj = null;
         int? nullable = (int?)12;
     }
}

此程序的前三个变量声明抛出以下警告:

变量“X”已分配,但其值从未使用过

然而,最后的声明:

int? nullable = (int?)12;

不扔任何东西。 这是为什么?

在此输入图像描述

您看到的警告仅在编译器可以证明用于初始化变量的表达式不可能导致任何副作用的情况下显示。 当您只是为变量分配文字字符串,整数或null值时,编译器知道这些事情都不会导致副作用。 对于你的最后一个值,你不只是分配一个文字值; 你也在使用类型的显式运算符,就编译器而言,该运算符只是一些可以执行任何操作的代码。 例如,它可能导致相关的副作用(它没有,但编译器不知道)会使该行不是多余的。

警告是最佳实践建议,它们不是真正的错误。 Visual Studio非常聪明,可以看到你创建了变量,但从未使用过它们,因此它们毫无用处。 它建议你摆脱它们,因为你不使用它们。

如果你真的对它们做了些什么,那么错误就会消失。 例如,如果你说:

number += nullable;

将摆脱1个错误。 如果你做了类似的事情:

message = message + " and this is more message";

它会摆脱另一个错误。

我相信它看到了int? 作为一个对象,因为你将它转换为可空变量,它无法弄清楚它是否已经被预先使用过。 我认为它与渲染有关的事情只是没有被捕获为错误,因为它无法判断你是否在其他地方引用了该变量。

我认为这将是相当于这样的事情:

var a = new SomeClass();
var b = a;

由于它无法判断a是否真的被使用过,因此它不会显示错误。 如果你把它放在真正的类中,它也不会显示错误。

似乎警告没有显示,因为具有可空的行实际上在分配之前执行操作。 例如,以下代码仅对名为number的变量生成警告。 这似乎是合乎逻辑的,因为带有警告的行在当前代码中实际上是无用的。 其他行可能在执行期间执行某些操作,并且不会“优化”。 要测试它在发布模式下使用调试器广告运行代码,您将看到所有带有警告的行都被跳过(“优化”)

class Program
{
    static void Main(string[] args)
    {
        string message = ';'.ToString();
        int number = 6;
        object obj = (object)(new t());
        int? nullable = (int?)12;
    }
    class t
    { }
}

有了这个说。 可以为空的它没有优化,因为从int'12'到int?的转换。 由于它是真正的演员,而不是“无用的演员”,因此在运行期间需要进行操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM