Type Checking: typeof, GetType, or is?

前端 未结 14 2268
北海茫月
北海茫月 2020-11-22 00:49

I\'ve seen many people use the following code:

Type t = typeof(obj1);
if (t == typeof(int))
    // Some code here

But I know you could also

14条回答
  •  感情败类
    2020-11-22 01:27

    If you're using C# 7, then it is time for an update to Andrew Hare's great answer. Pattern matching has introduced a nice shortcut that gives us a typed variable within the context of the if statement, without requiring a separate declaration/cast and check:

    if (obj1 is int integerValue)
    {
        integerValue++;
    }
    

    This looks pretty underwhelming for a single cast like this, but really shines when you have many possible types coming into your routine. The below is the old way to avoid casting twice:

    Button button = obj1 as Button;
    if (button != null)
    {
        // do stuff...
        return;
    }
    TextBox text = obj1 as TextBox;
    if (text != null)
    {
        // do stuff...
        return;
    }
    Label label = obj1 as Label;
    if (label != null)
    {
        // do stuff...
        return;
    }
    // ... and so on
    

    Working around shrinking this code as much as possible, as well as avoiding duplicate casts of the same object has always bothered me. The above is nicely compressed with pattern matching to the following:

    switch (obj1)
    {
        case Button button:
            // do stuff...
            break;
        case TextBox text:
            // do stuff...
            break;
        case Label label:
            // do stuff...
            break;
        // and so on...
    }
    

    EDIT: Updated the longer new method to use a switch as per Palec's comment.

提交回复
热议问题