我使用unity,我尝试使用代码:
class C
{
}
void m()
{
var c = GetComponent<Collider>();
if (c)
{
}
var c2 = new C();
if (c2)
{
}
}
if (c)
语法正确且if (c2)
语法错误,我希望if (c2)
语法正确,我应该如何修改class C
答案 0 :(得分:3)
首先:这里统一库的设计是糟糕的C#API设计,你不应该尝试复制它。在C#中使用if(c)
检查对象的无效性是不惯用语。您应该始终使用if (c != null)
检查是否为null,并且您应该将要检查的对象设置为null。
通常启用if(c)
样式检查的唯一时间是对象逻辑上表示布尔而不实际为bool
。例如,假设您有一个类型SecurityCheck
,表示用户是否通过了安全检查;你可能在实例中拥有的信息多于bool,但你可能希望能够在需要bool的环境中使用它。
在这种情况下,有两种方法可以做到这一点。
&
和|
的自定义实施中保留实例的内容,那么您应该提供运算符|
,&
,{{的自定义实现1}}和true
。如果您这样做,那么false
,if
等将使用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它可能意味着别的东西。在我发布的示例代码中,它确实检查对象是否为空。