C#:'is'关键字并检查Not

Hug*_*are 263 c# casting keyword

这是一个愚蠢的问题,但您可以使用此代码来检查某些内容是否属于特定类型...

if (child is IContainer) { //....
Run Code Online (Sandbox Code Playgroud)

是否有更优雅的方法来检查"NOT"实例?

if (!(child is IContainer)) { //A little ugly... silly, yes I know...

//these don't work :)
if (child !is IContainer) {
if (child isnt IContainer) { 
if (child aint IContainer) { 
if (child isnotafreaking IContainer) { 
Run Code Online (Sandbox Code Playgroud)

是的,是的......愚蠢的问题....

因为对代码的外观存在一些疑问,所以它只是在方法开始时的简单返回.

public void Update(DocumentPart part) {
    part.Update();
    if (!(DocumentPart is IContainer)) { return; }
    foreach(DocumentPart child in ((IContainer)part).Children) {
       //...etc...
Run Code Online (Sandbox Code Playgroud)

Meh*_*ari 283

if(!(child is IContainer))
Run Code Online (Sandbox Code Playgroud)

是唯一的运营商(没有IsNot运营商).

您可以构建一个执行它的扩展方法:

public static bool IsA<T>(this object obj) {
    return obj is T;
}
Run Code Online (Sandbox Code Playgroud)

然后用它来:

if (!child.IsA<IContainer>())
Run Code Online (Sandbox Code Playgroud)

你可以按照你的主题:

public static bool IsNotAFreaking<T>(this object obj) {
    return !(obj is T);
}

if (child.IsNotAFreaking<IContainer>()) { // ...
Run Code Online (Sandbox Code Playgroud)

更新(考虑OP的代码片段):

由于您实际上是在实际投射该值后,您可以使用as:

public void Update(DocumentPart part) {
    part.Update();
    IContainer containerPart = part as IContainer;
    if(containerPart == null) return;
    foreach(DocumentPart child in containerPart.Children) { // omit the cast.
       //...etc...
Run Code Online (Sandbox Code Playgroud)

  • 是.我在开玩笑,以防它不明显. (5认同)
  • ck:我的意思是在运营商的意义上,没有“IsNot”的东西。 (2认同)

cjk*_*cjk 107

你可以这样做:

object a = new StreamWriter("c:\\temp\\test.txt");

if (a is TextReader == false)
{
   Console.WriteLine("failed");
}
Run Code Online (Sandbox Code Playgroud)

  • @Frank它的工作原理是因为`is`相对于`=='具有更高的优先级.你不能使用`!x是f`的唯一原因是它的优先级低于`!`. (31认同)
  • @Frank - 是的,is关键字给出一个布尔值,你可以将其与false进行比较 (2认同)

Tod*_*ton 35

这个还没有提到。它有效,我认为它看起来比使用更好!(child is IContainer)

if (part is IContainer is false)
{
    return;
}
Run Code Online (Sandbox Code Playgroud)

C# 9.0 中的新功能

https://devblogs.microsoft.com/dotnet/welcome-to-c-9-0/#logical-patterns

if (part is not IContainer)
{
    return;
}
Run Code Online (Sandbox Code Playgroud)

  • 类似地,您可以执行 `if (part as IContainer is null)`。老实说,不确定哪个更好。 (4认同)

Tho*_*sen 14

C# 9(与 .NET 5 一起发布)包括逻辑模式and,ornot,这使我们可以更优雅地编写它:

if (child is not IContainer) { ... }
Run Code Online (Sandbox Code Playgroud)

同样,此模式可用于检查 null:

if (child is not null) { ... }
Run Code Online (Sandbox Code Playgroud)


Mar*_*rst 12

为什么不用别的呢?

if (child is IContainer)
{
  //
}
else
{
  // Do what you want here
}
Run Code Online (Sandbox Code Playgroud)

它整洁熟悉而简单?

  • 它没有错 - 这只是一个挑剔的问题.如果某些东西不是特定类型,我想立即退出函数.我现在已经完成了(!(孩子是某事)),但我想我确保没有更好的方法. (3认同)

Rob*_*ino 8

您拥有它的方式很好,但您可以创建一组扩展方法,以"更优雅地检查'NOT'实例."

public static bool Is<T>(this object myObject)
{
    return (myObject is T);
}

public static bool IsNot<T>(this object myObject)
{
    return !(myObject is T);
}
Run Code Online (Sandbox Code Playgroud)

然后你可以写:

if (child.IsNot<IContainer>())
{
    // child is not an IContainer
}
Run Code Online (Sandbox Code Playgroud)


BFr*_*ree 5

丑陋?我不同意。唯一的其他方式(我个人认为这是“更丑陋的”):

var obj = child as IContainer;
if(obj == null)
{
   //child "aint" IContainer
}
Run Code Online (Sandbox Code Playgroud)

  • 如果目标类型是值类型,则此方法将无效。 (12认同)