对象上的感叹号操作符
本文关键字:操作符 感叹 对象 | 更新日期: 2023-09-27 18:15:45
在c#中,下面的代码片段是做什么的?
1)
if (!object)
{
//code
}
2)
if (object)
{
//code
}
其中object是一个类的实例,并且绝对不是bool
。
1)在Java中,尝试上述代码将使编译器发出错误。只有布尔变量可以用作Condition_Block。
2)在c++中,if (!object){/**/}
用于null检查。
3)在c#中,编译器不会发出错误并愉快地编译它。谷歌从来没有提到过!用于对象的操作符。它只给出bool值的搜索结果。此外,雪上加霜的是,它给出的结果是人们在谈论?和? ?操作符,这些操作可能在30-40年内不会提供给unity开发者。仅支持NET3.5 API。如果!操作符在c++中的工作原理,为什么人们需要?和? ? .
编辑:完整代码。
using UnityEngine;
using System.Collections;
public class Foo : MonoBehaviour
{
void Start ()
{
Foo a = new Foo();
if (a) Debug.Log("a");
if (!a) Debug.Log("b");
}
}
执行时输出"b"
在c#中有三种情况if (!object)
会被编译:
-
object
为bool
类型 - 如果
object
类型已经定义了implicit operator bool
过载。 - 如果
!
操作符已经为object
类型重载。
重载!
的例子:
class Test
{
public int Value;
public static bool operator ! (Test item)
{
return item.Value != 0;
}
}
然后:
Test test = new Test();
Console.WriteLine(!test); // Prints "False"
test.Value = 1;
Console.WriteLine(!test); // Prints "True"
在c#中有两种if (object)
编译的情况:
- 如果
object
是bool
类型,则 - 为
object
类型定义implicit operator bool
过载。
implicit operator bool
:
class Test
{
public int Value;
public static implicit operator bool(Test item)
{
return item.Value != 0;
}
}
然后:
Test test = new Test();
Console.WriteLine(!test); // Prints "True"
if (test)
Console.WriteLine("This is not printed");
test.Value = 1;
Console.WriteLine(!test); // Prints "False"
if (test)
Console.WriteLine("This is printed");