如果在忽略"!= null"的条件下如何使用类实例

时间:2018-04-19 14:39:54

标签: c# unity3d

我使用unity,我尝试使用代码:

    class C
    {

    }

    void m()
    {
        var c = GetComponent<Collider>();
        if (c)
        {

        }

        var c2 = new C();
        if (c2)
        {

        }
    }

Rider语法检查显示: enter image description here

if (c)语法正确且if (c2)语法错误,我希望if (c2)语法正确,我应该如何修改class C

4 个答案:

答案 0 :(得分:3)

首先:这里统一库的设计是糟糕的C#API设计,你不应该尝试复制它。在C#中使用if(c)检查对象的无效性是惯用语。您应该始终使用if (c != null)检查是否为null,并且您应该将要检查的对象设置为null。

通常启用if(c)样式检查的唯一时间是对象逻辑上表示布尔而不实际为bool 。例如,假设您有一个类型SecurityCheck,表示用户是否通过了安全检查;你可能在实例中拥有的信息多于bool,但你可能希望能够在需要bool的环境中使用它。

在这种情况下,有两种方法可以做到这一点。

  • 如果某个实例可以转换到bool,那么您可以将用户定义的隐式转换写入bool。
  • 如果您想在&|的自定义实施中保留实例的内容,那么您应该提供运算符|&,{{的自定义实现1}}和true。如果您这样做,那么falseif等将使用while来确定是否符合条件。

但是再说一遍:不要在这里模仿Unity的设计。 不要仅仅检查无效的转换为bool 。这不是我们在C#中检查无效的方式。 如果要检查null,则应写入空检查。

答案 1 :(得分:1)

您为c2显示的检查在C#中不起作用(例如,与Javascript相反)。

相反,您必须显式测试null。或者您可以使用null-conditional operators

以下所有变体都会在调用NullReferenceException时阻止DoSomething()

检查null并抛出:

if (c2 == null) {
    throw new ArgumentNullException(nameof(c2));
}
c2.DoSomething();

检查not null并继续工作:

if (c2 != null) {
    c2.DoSomething();
}

使用空条件运算符:

c2?.DoSomething(); // will do nothing if c2 is null

答案 2 :(得分:1)

我只需使用:

来检查c2的空状态
if (c2 != null)

这是标准,清晰和简洁的。

我们经常希望使代码更简洁,因此尝试将逻辑简化为if (c2),但不清楚从C()构造函数返回的对象是否可以隐含地转换为bool。即使C对象可以隐式转换为bool,这也是不常见的,因此在你之后出现的程序员可能想知道为什么/如何检查对象是否为空。< / p>

为了更进一步,我会以同样的方式检查c的空状态,而不是依靠GetComponent<Collider>()来返回一个bool。通常,清晰度优于简洁。

答案 3 :(得分:1)

可读性应始终是一个更高的优先级,因此像if(c != null)if(c == null)这样的检查并不是一件坏事(它们是一件好事),它表明您打算专门为此输入该功能那些情况if(!c)有时会被误解,因为有人错过了!但是为了回答你的问题,你可以将你的C级改为:

class C
{
    public static implicit operator bool(C obj) 
    {
        return obj != null; 
    }
}

请注意,仅仅因为你可以if(collider)一个对象并不一定意味着隐式转换意味着它不是null它可能意味着别的东西。在我发布的示例代码中,它确实检查对象是否为空。