Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么不是';“在那里”;不是",;c#中的关键字?_C#_Compiler Construction_Types_Keyword - Fatal编程技术网

为什么不是';“在那里”;不是",;c#中的关键字?

为什么不是';“在那里”;不是",;c#中的关键字?,c#,compiler-construction,types,keyword,C#,Compiler Construction,Types,Keyword,有时检查对象是否不是X类型是有意义的,因此您需要执行以下操作: if(this.GetType() != typeof(X)) { //Do my thing. } 这对我来说有点麻烦,像这样的事情不是更好吗: if(this is not X) { //Do my thing } 逻辑NOT运算符如何,正好符合“不”一词的描述: if (!(this is X)) { //Do my thing } 但是,正如其他人指出的,is还用于检查

有时检查对象是否不是X类型是有意义的,因此您需要执行以下操作:

 if(this.GetType() != typeof(X)) 
 {
      //Do my thing.

 }
这对我来说有点麻烦,像这样的事情不是更好吗:

 if(this is not X) 
 {
     //Do my thing
 }

逻辑NOT运算符如何
,正好符合“不”一词的描述:

if (!(this is X)) 
{
    //Do my thing
}
但是,正如其他人指出的,
is
还用于检查对象的类是否继承自某个类或实现某个接口,这与
GetType()
大不相同


两者都有合理的解释,解释为什么C#中没有
not
关键字。

使用好的ol'bang符号:

if (!(pero is Human)) 
{

}
顺便说一句,
is
是不同的,因为它不仅捕获了叶派生类,而且捕获了它的整个层次结构,包括接口和类

那么,为了

class Human: ICanSpeak, Mamal
{
...
}

Human h;

if (h is Human)  {   will be true  }
if (h is ICanSpeak)  {  will be true  }
if (h is Mamal) {  will also be true  }

请注意,
this.GetType()
!=
typeof(X)
如果派生自(或在接口类型的情况下实现)但与X不同,则返回false,而
这是X
返回true

当你可以直接使用
时,为什么会有一个单独的关键字呢!(a是X)
?这让语言变得臃肿,但收效甚微。正如Eric Lippert喜欢强调的那样,每一种新的语言特性都需要提供足够的优势来补偿编码、文档编制、测试,当然还有语言复杂性的增加。而
不是
操作符就是提供的信息不够

您可以实现扩展方法,但我认为这很愚蠢:

public static bool IsNot<T>(this object obj)
{
  return !(obj is T);
}
public static bool IsNot(此对象对象对象)
{
返回!(obj为T);
}

在语言中添加关键字会增加复杂性。在初始规范之后向语言添加关键字可能会导致升级人员发生重大更改。因此,关键字通常只有在有充分理由的情况下才会被添加。在这种情况下,正如其他答案所指出的,使用bang运算符非常容易:

if (!(pero is Human)) ...

。。。一个典型的C#(/C/C++/Java)开发人员会读到“如果不是(pero是人)”。因此,对于一个特殊的关键字没有太多的理由。

如果
X
this.GetType()
的一个子类型,那么这些关键字在功能上是不等价的。例如,我们在C中没有
yield
关键字,因为这将是一个突破性的变化<另一方面,code>yield return x
以前的语法是非法的,因此没有破坏性的更改。@CodeInChaos:是的,但是
不是
关键字在技术上可能与
yield return
属于同一类别。不同之处在于,模拟
收益返回需要大量的工作,而bang操作符和括号足以模拟
不是
。我相信
不是
操作符(没有空格)将非常容易和安全地实现。我肯定会投票支持它成为C#语法的一部分。很多次,在快速编码的同时,我几乎已经写了它。这很自然。它还具有智能感知功能,可以保存所有括号和否定运算符的键入。简而言之,它很方便。除了对象上的扩展方法是一个有问题的编程实践之外,这实际上是一个不错的小扩展方法。我并不是说我会使用它,但我认为它是相当合理的。@Eric:我真希望C#had除此之外还有一个not运算符not!。有人可能会说这没用,但是!在代码中很难看到/点,如果“不”(vector。ISDULL)比“if!(vector。ISDULL)”更容易解析,但我猜C是这样做的,不是为了疏离C++用户,对吗?“埃里克,我可以问为什么对象扩展方法被视为坏实践吗?”Joe:正确。我同意用“!”来表示“不”是不必要的简洁;基本上,这是一个“密码”,你必须知道,以了解文本的含义。但正如您所注意到的,这在类C语言中是惯用的。在VB中,顺便说一句,有一个“IsNot”操作符。@Max:因为很少有一个方法可以处理字符串、整数、老虎、文档、香蕉列表、类型。。。“对象”上的任何扩展方法实际上只适用于所有可能对象的一小部分,这种可能性很大。这不是一条硬性规定,但它有点代码味道。我们不需要将
而不是
设为关键字。让
不是一个类似于
收益率的关键字就足够了。这可能有点让人困惑,因为大多数C#程序员都不习惯使用两个词的关键字(或者我应该称之为关键字?)。因此,我们必须使用
isnot
,这在国际海事组织看来很难看。我希望在C语言中的一些特殊情况下允许使用“!”,在这些情况下,它有明确的含义,但目前不合法。一种情况是if、while等的括号外(在这种情况下,无论运算符重载如何,都应严格反转条件)。另一种情况在这里可能很好:允许“this!is x”,以避免额外的括号。