检查对象是否不是类型(!=等价于“ IS”)-C#


75

这很好用:

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

    }

有没有一种方法来检查发件人是否不是TextBox,某种等同于“ is”的!=?

请不要建议将逻辑移至ELSE {} :)

Answers:


183

这是一种方法:

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

7
对于这种特殊情况,我更喜欢if(发送者是TextBox == false)。这样不太笨拙的语法。
伊加尔·塔巴尼克

8
@hmemcpy:就个人而言,每当我看到与布尔常量的比较时,我都会畏缩。可能我的C背景正在显示...仍然,这使我的皮肤变得爬行,而且我无法在我正在编辑的代码中留下它。
Shog9,2009年

@IgalTabachnik imo,如果您打算用冗长的措辞编写逻辑上颠倒的语句,则可以清楚地将其写为if (false == sender is TextBox)
Chris Marisic

1
@ Shog9我几年前开始编程(绝对不是用C编程的),但我从来不明白为什么人们使用== false或使用false ==:这对我来说根本不直观,我总是更喜欢!超过它。只是-多余。
马菲

阅读以上评论后,我认为使用起来false比否定起来更清晰。单词的使用is可能会引起足够的视觉干扰,以至于只看一眼代码就很容易错过!
–theMayer

8

您是否也可以在is关键字之前做更冗长的“旧”方式:

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

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


2

两种众所周知的方法是:

1)使用IS运算符:

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

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

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

对于未来的读者:is和之间的区别as可以在这里
kkuilla

-2

如果您像这样使用继承:

public class BaseClass
{}
public class Foo : BaseClass
{}
public class Bar : BaseClass
{}

...耐零

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行的行为与GetType()上的行为不同object?除此之外,类似这样的字符串比较不是重构友好代码。
user247702 '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.