gpt4 book ai didi

c# - 为什么每次调用该方法时 Compile() 都不运行?

转载 作者:行者123 更新时间:2023-11-30 16:47:58 26 4
gpt4 key购买 nike

这里是 a code piece from MiscUtil library (由 Jon Skeet 和 Marc Gravell 撰写):

static T Add<T>(T a, T b) {
//TODO: re-use delegate!
// declare the parameters
ParameterExpression paramA = Expression.Parameter(typeof(T), "a"),
paramB = Expression.Parameter(typeof(T), "b");
// add the parameters together
BinaryExpression body = Expression.Add(paramA, paramB);
// compile it
Func<T, T, T> add = Expression.Lambda<Func<T, T, T>>(body, paramA, paramB).Compile();
// call it
return add(a,b);
}

它在代码下面说:

Isn't this expensive?

Well, compiling the operators isn't trivial, but the static constructor ensures that we only do this once for each signature.

背后的原因是什么Func<T, T, T>不会每次都编译 Add<T>(T a, T b)方法被调用,但 insted 只被编译一次?

最佳答案

每种类型只有一个静态字段,它在它们之间共享。此字段在首次使用之前初始化 ( see this old documentation from MSDN )。

If a static constructor (...) exists in the class, execution of the static field initializers occurs immediately prior to executing that static constructor. Otherwise, the static field initializers are executed at an implementation-dependent time prior to the first use of a static field of that class.

所以当你声明并尝试使用SomeType<int,int>第一次,它的静态字段被初始化。当您声明并尝试使用 SomeType<int,int>第二次,再次创建这个字段没有意义。它已经存在!它由 .NET 环境内部管理。这就是语言的设计方式。

请注意 SomeType<int,int>SomeType<int,long>是不同的类型(不同的类型参数)并且需要单独的静态字段。

关于c# - 为什么每次调用该方法时 Compile() 都不运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38735297/

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