2017-04-25 147 views
0

如果我需要一些特定類型的代碼,我可以用typeof例如:類型碼VS的typeof

private static bool IsNumericType(Type type) 
{ 
    return type == typeof(int) || type == typeof(decimal); //etc 
} 

但我也可以用枚舉TypeCode

private static bool IsNumeric(TypeCode objTypeCode) 
{ 
    return objTypeCode == TypeCode.Int16 || objTypeCode == TypeCode.Int32 || objTypeCode == TypeCode.Int64; // etc || 
} 

什麼是使用的好處TypeCodetypeof從建築和性能角度?在這種情況下,我應該使用兩者中的哪一個?

FYI,代碼從一個值獲得type/typeCode

var type = value.GetType(); 
var typeCode = Convert.GetTypeCode(value); 

PS:這些實施例非常簡化。

PS 2:如果我通過該值,我也可以使用as,is等。但在這種情況下,我不喜歡發送,因爲該方法不需要知道該值,只有它的類型。

+0

我很確定前面的代碼片斷會更高效。基於這一點,在編譯時和運行時執行'typeof()'這一事實。它也不需要'Convert.GetTypeCode()'調用。你可以隨時對它進行基準測試,然後看看自己! – itsme86

+0

GetTypeCode隱藏在.NET版本1中。在沒有泛型的絕望日子裏,讓交換語句高效地回到那些黑暗的doomy中非常重要。他們甚至修正了版本7中的switch語句。 –

回答

1

TypeCode當您遵循幾條可能的路徑時,最有效,並且大部分或全部邏輯都可以通過單獨檢查代碼來完成,因爲這樣會非常高效,而且通常非常清晰。

在其他情況下,Object分支內部可能與外部擁有儘可能多的邏輯,因爲這是大多數類型的代碼,在這種情況下,它不會像先檢查代碼那樣有用,除非可能由它服務得很好也是經常出現的情況。

IsNumeric例子是,當TypeCode效果很好,如果你是重寫您正在使用一個虛擬呼叫應答獲得編譯爲相對高效的跳躍,而不是分行代碼和排序的一個開關的開關的一個很好的例子對不同可能類型的多重比較。

請注意,枚舉類型與其基礎數值類型具有相同的代碼。無論這種情況是否包括免費提供的這些案件,還是作爲一個案例,您都必須分別採取防範措施,這取決於您希望如何將這些類型用於任何目的。

2

的幾個注意事項,我纔回答:

  1. typeof需要一個類型(不是實例)
  2. GetTypeCode要求實現IConvertible接口

因此它們是不同的一個實例。所以你需要問自己的問題是你想要一個實例或類型的類型。


這是從MSDN:

呼叫於實現IConvertible接口以獲得類型代碼爲類的實例的類的方法GetTypeCode。 否則,調用對象的GetType方法來獲取其Type對象,然後調用Type對象的GetTypeCode方法來獲取對象的類型代碼。

因此,如果一個類型不實現IConvertible接口,那麼你需要做2個呼叫:GetType,然後調用GetTypeCode。我還拉從.NET源代碼的代碼GetTypeCode

public static TypeCode GetTypeCode(Type type) 
{ 
    if (type == null) 
     return TypeCode.Empty; 
    return type.GetTypeCodeImpl(); 
} 

protected virtual TypeCode GetTypeCodeImpl() 
{ 
    // System.RuntimeType overrides GetTypeCodeInternal 
    // so we can assume that this is not a runtime type 

    // this is true for EnumBuilder but not the other System.Type subclasses in BCL 
    if (this != UnderlyingSystemType && UnderlyingSystemType != null) 
     return Type.GetTypeCode(UnderlyingSystemType); 

    return TypeCode.Object; 
} 

正如你可以看到有相當多的事情出現。現在沒有基準測試,很難說,但我很確定,因爲typeof是編譯時間,並且它是C#原生的,所以團隊已經將它放在了工作中以使其更高效。事實上,typeof是:

  1. 原產於C#
  2. 在編譯時決定
  3. 不依賴接口
  4. 上在某些情況下
  5. 更直截了當
  6. 不是2來電

我會去typeof

我永遠記住這條規則:

首先使它工作。然後,只有當你需要更快地工作時,才能改變它。

+1

'GetTypeCode'不需要實現'IConvertible'接口的實例,你可以在任何類型上調用'Type.GetTypeCode()'。 –

+0

它看起來像'GetTypeCode()'擴展方法只適用於實現'IConvertible'的對象,但您可以將任何類型傳遞給'Type.GetTypeCode()'方法。 – BurnsBA