gpt4 book ai didi

.net-3.5 - 扩展方法性能

转载 作者:行者123 更新时间:2023-12-04 00:22:31 26 4
gpt4 key购买 nike

            /*I have defined Extension Methods for the TypeX like this*/ 
public static Int32 GetValueAsInt(this TypeX oValue)
{
return Int32.Parse(oValue.ToString());
}
public static Boolean GetValueAsBoolean(this TypeX oValue)
{
return Boolean.Parse(oValue.ToString());
}


TypeX x = new TypeX("1");
TypeX y = new TypeX("true");


//Method #1
Int32 iXValue = x.GetValueAsInt();
Boolean iYValue = y.GetValueAsBoolean();

//Method #2
Int32 iXValueDirect = Int32.Parse(x.ToString());
Boolean iYValueDirect = Boolean.Parse(y.ToString());

不要被 TypeX 冲昏头脑,说我应该在 TypeX 而不是扩展中定义这些方法)我无法控制它(我定义的实际类在 SPListItem 上)。

我想将 TypeX 转换为 Int 或 Boolean,这个操作是我在代码中的很多地方做的一件常见的事情。我想知道这是否会导致性能下降。我尝试使用 Reflector 解释 IL 代码,但并不擅长。可能对于上面的例子,不会有任何性能下降。一般来说,我想知道在使用扩展方法时关于性能的影响。

最佳答案

扩展方法只是编译时的更改:

x.GetValueAsBoolean()


Extensions.GetValueAsBoolean(x)

这就是所涉及的全部内容 - 将看起来像实例方法调用的内容转换为对静态方法的调用。

如果静态方法没有性能问题,那么将其作为扩展方法不会引入任何新问题。

编辑:IL,根据要求...

拿这个样本:
using System;

public static class Extensions
{
public static void Dump(this string x)
{
Console.WriteLine(x);
}
}

class Test
{
static void Extension()
{
"test".Dump();
}

static void Normal()
{
Extensions.Dump("test");
}
}

这是 Extension 的 IL和 Normal :
.method private hidebysig static void  Extension() cil managed
{
// Code size 13 (0xd)
.maxstack 8
IL_0000: nop
IL_0001: ldstr "test"
IL_0006: call void Extensions::Dump(string)
IL_000b: nop
IL_000c: ret
} // end of method Test::Extension

.method private hidebysig static void Normal() cil managed
{
// Code size 13 (0xd)
.maxstack 8
IL_0000: nop
IL_0001: ldstr "test"
IL_0006: call void Extensions::Dump(string)
IL_000b: nop
IL_000c: ret
} // end of method Test::Normal

如您所见,它们完全相同。

关于.net-3.5 - 扩展方法性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1006537/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com