检查对象是否不是某种类型("!="相当于"IS")- C#

87

这个很好地运作:

    protected void txtTest_Load(object sender, EventArgs e)
    {
        if (sender is TextBox) {...}

    }
有没有一种方法可以检查发送方不是一个TextBox,类似于"is"的"!="的等效方式?
请不要建议将逻辑移动到ELSE{}中 :)
6个回答

199

这是一种方法:

if (!(sender is TextBox)) {...}

7
对于这种情况,我更喜欢使用类似 (sender is TextBox == false) 这样不那么笨重的语法。 - Igal Tabachnik
10
个人而言,每当我看到与布尔常量的比较时,我都会感到不舒服。可能是因为我的C编程背景...但这确实让我很不爽,在我编辑的代码中,我绝不会放过它。 - Shog9
@IgalTabachnik 我认为,如果你要写逻辑上反转的陈述,并使用冗长的语言来表达清晰,那么更好的方式是这样写:if (false == sender is TextBox) - Chris Marisic
1
@Shog9 几年前我开始学习编程(当然不是从C语言开始),我一直不明白为什么有些人会使用“== false”或者“false ==”,这对我来说并不更加直观,我总是更喜欢使用“!”。这只是多余的。 - Mafii
1
阅读上面的评论后,我认为使用false比否定更清晰。使用单词is可能会分散注意力,仅仅浏览代码就很容易错过! - theMayer
显示剩余2条评论

22

C# 9 允许使用 not 运算符。您只需要使用它即可。

if (sender is not TextBox) {...}

取代

if (!(sender is TextBox)) {...}

8

在使用is关键字之前,您是否也可以使用更冗长的“旧”方法:

if (sender.GetType() != typeof(TextBox)) { // ... }

13
当然可以,但请注意,“is”关键字匹配任何派生自TextBox的对象,而typeof()检查仅匹配TextBoxes。 - mqp

3

有两种常见的做法:

1)使用IS运算符:

if (!(sender is TextBox)) {...}

2) 使用AS运算符(如果您也需要使用textBox实例,则很有用):

var textBox = sender as TextBox;  
if (sender == null) {...}

对于未来的读者:isas 的区别可以在这里找到:https://learn.microsoft.com/en-gb/dotnet/csharp/language-reference/operators/type-testing-and-cast - kkuilla

-2
如果您使用继承,例如:
public class BaseClass
{}
public class Foo : BaseClass
{}
public class Bar : BaseClass
{}

...空值(Null)防护

if (obj?.GetType().BaseType != typeof(Bar)) { // ... }

或者

if (!(sender is Foo)) { //... }

-4

试试这个。

var cont= textboxobject as Control;
if(cont.GetType().Name=="TextBox")
{
   MessageBox.show("textboxobject is a textbox");
} 

1
为什么初始的 as Control 行为与在 object 上使用 GetType() 不同?除此之外,像这样的字符串比较不利于重构友好的代码。 - user247702
这个错误有几个层面。如果您要通过名称进行类型检查,则没有必要进行初始的“as”操作。此外,永远不要硬编码诸如“TextBox”之类的内容。如果您想以这种方式进行检查,请改用FullName而不是Name:if (cont.GetType().FullName == typeof(TextBox).FullName) {}。在使用Name时,不要省略命名空间,以防您在不同的命名空间中创建自己的自定义控件并将其命名为TextBox。 - rhoonah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接