组合框'的项为空时是否为空?

本文关键字:是否 组合 | 更新日期: 2023-09-27 17:49:17

Resharper希望我修改这段代码:

foreach (var item in cmbxColor1.Items)
{
    cmbxColor2.Items.Add(item);
    . . .

…因为上面写着"可能的"系统。NullReferencesException"

应该是这样的

foreach (var item in cmbxColor1.Items)
{
    if (null != cmbxColor2.Items)
    {
        cmbxColor2.Items.Add(item);
. . .

?

我不明白这个-怎么可能一个组合框的项目是空的,除非null ==空?如果null == empty,那么当调用这段代码时,they [s,w]就应该是这个值

组合框'的项为空时是否为空?

我认为Resharper在这里是错误的,因为ComboBoxItems集合似乎是由它的构造函数初始化的。即:

ComboBox c = new ComboBox();
c.Items.Add("1");

保证是OK的。

这里也只有get访问器对我们可用,所以没有人可以用另一个(或null)代替这个集合。虽然我不太确定,如果有可能影响这个集合,而衍生自ComboBox(我不能一次找到smth),我想即使这样,它仍然保证不为空。

Null不为空。

Resharper团队已经对许多。net类进行了一些自动代码分析,以确定哪些方法和属性可以返回null。如果Resharper声称它可以为空,那可能是因为有某种方法(可能是模糊的)它实际上可以为空。

如果你正在使用一个外部库(例如mscorlib.dll),它似乎不可行,为它的实体使用属性指定契约。进入外部注解。这个ReSharper功能允许你用ReSharper的分析引擎使用的属性来补充已经编译的实体。外部注解可以让你"欺骗"引擎,让它看到在编译库时没有声明的属性(方法、参数和其他声明)。要做到这一点,必须在位于<ReSharper install directory>'Bin'ExternalAnnotations中的XML文件中指定属性。

这就是ReSharper安装时存储在这个文件夹中的标准库的契约定义。这些契约是基于源代码分析和微软契约获得的。使用前一种技术获得的契约存储在类型为*.Generated.xml的文件中,使用后一种技术获得的契约存储在类型为*.Contracts.xml的文件中。

然而,我同意在实践中不太可能是null。也可能是Resharper过于谨慎了——证明某物是否可以为空是一个难题。如果你认为分析是错误的,你可以修改注释。

  • ReSharper NullReferenceException Analysis and Its Contracts

我宁愿这样做。

foreach (var item in cmbxColor1.Items)
{
    if (cmbxColor2.Items.Count > 0)
    {
        cmbxColor2.Items.Add(item);
    }
}