bra*_*don 7 c# reflection performance types
我决定在一个函数中检查类型,而不是将函数重载100次或为不同类型创建100个不同的比较器.
例如,我使用默认比较器来比较2个对象中的一组类型(基元和字符串)的值.它包含以下代码:
public class DefComparer : IComparer<object> {
public int Compare(object a, object b) {
.... // a = a.GetType().GetField(field).GetValue(a); - not important for the question but I'm just showing that a&b below are different references
switch (a.GetType().Name) {
case "Byte":
if ((byte)a == (byte)b) return 0;
else if ((byte)a > (byte)b) return 1;
else return -1;
case "UInt16":
if ((ushort)a == (ushort)b) return 0;
else if ((ushort)a > (ushort)b) return 1;
else return -1;
case "SByte":
if ((sbyte)a == (sbyte)b) return 0;
else if ((sbyte)a > (sbyte)b) return 1;
else return -1;
case "Int16":
...
Run Code Online (Sandbox Code Playgroud)
在这里,我使用的switch语句比一系列if/ else语句更快.但是a.GetType().Name返回一个动态获得的字符串,这个方法涉及字符串比较.这对我来说听起来不是特别快.我需要Comparer在技术上尽可能快,因为它将用于大量数据集合.
问:有没有更快的方法来检查对象的类型(不涉及字符串比较)?什么是最快的方式?
好吧,你手里拿着它.使用TypeCode
int a = 10;
Type t = a.GetType();
switch (Type.GetTypeCode(t))
{
case TypeCode.Boolean:
break;
case TypeCode.Byte:
break;
case TypeCode.Char:
break;
case TypeCode.DBNull:
break;
case TypeCode.DateTime:
break;
case TypeCode.Decimal:
break;
case TypeCode.Double:
break;
case TypeCode.Empty:
break;
case TypeCode.Int16:
break;
case TypeCode.Int32:
break;
case TypeCode.Int64:
break;
case TypeCode.Object:
break;
case TypeCode.SByte:
break;
case TypeCode.Single:
break;
case TypeCode.String:
break;
case TypeCode.UInt16:
break;
case TypeCode.UInt32:
break;
case TypeCode.UInt64:
break;
default:
break;
}
Run Code Online (Sandbox Code Playgroud)
这支持所有原语.对于Custom对象else if在里面写语句TypeCode.Object.
我希望这有帮助.
| 归档时间: |
|
| 查看次数: |
1882 次 |
| 最近记录: |