1

我写了一个解析器生成器,它有这样的表达式:

a = f:"foo" "bar" { /* your code here */ }

经过一段时间后,它会生成如下所示的代码:

r0 = this.ReturnHelper<string>(cursor, cursor, () => /* your code here */);

这是完美的,因为用户可以指定一个表达式,比如f只返回一个值,或者他们可以添加一组额外的花括号并编写一个方法。到目前为止,一切都很好。

现在,我也允许这样的断言:

a = w:word !{ w == "disallowed" }

目前编译成这样的东西:

var w = this.ParseWord(...).Value;

...

if (!( w == "disallowed" ))
{
    r2 = new ParseResult<string>(cursor, cursor, string.Empty);
}

我希望断言支持 ReturnHelper 提供的相同方法体选项,但是拥有一个bool AssertionHelper(Func<bool> assertion)只调用谓词的方法似乎效率低下。

我在想这new Func<bool>(() => /* your code here */)()会起作用,但我不确定它是最有效的。

有任何想法吗?

编辑

怎么样((Func<bool>)(() => /* code */))()?这是否避免了分配? 不,它会生成与上述版本相同的 IL。

4

1 回答 1

1

目前尚不清楚为什么您需要Func<bool>明确提及。为什么不只是:

this.AssertionHelper<string>(cursor, cursor, () => !( w == "disallowed" ))

? 假设它将是一个没有参数的单个表达式并且它是 type bool,那应该没问题。

如果它需要一个参数w,只需将其更改为:

this.AssertionHelper<string>(cursor, cursor, w => !( w == "disallowed" ))

我相信 C# 编译器的 MS 实现将避免在每次调用 this 时创建一个新的委托实例 - 但真的,这有关系吗?您是否分析过您的应用程序以检查这是否真的对性能造成了重大影响?如果你有,那很好——我当然已经看到了一些有趣的数据,这些数据围绕着一些代表微优化可以产生影响的情况——但在我发现这是一个实际问题之前我不会担心它。

于 2012-08-30T06:08:07.117 回答