在C#语言和.NET框架中,您能帮我理解委托吗?我试图检查一些代码,发现我收到的结果对我来说意外.这里是:
class Program
{
public static int I = 0;
static Func<string> del = new Func<string>(I.ToString);
static void Main(string[] args)
{
I = 10;
Console.WriteLine("{0}", del());
}
}
Run Code Online (Sandbox Code Playgroud)
答案是0,但不是10.为什么?
我今天看到了这个关于ConcurrentDictionary方法的一些性能差异的问题,我认为这是一个过早的微优化。
然而,经过一番思考,我意识到(如果我没记错的话),每次我们将 lambda 传递给一个方法时,CLR 都需要分配内存,传递适当的闭包(如果需要),然后过一段时间再收集它.
有以下三种可能:
没有闭包的 Lambda:
// the lambda should internally compile to a static method,
// but will CLR instantiate a new ManagedDelegate wrapper or
// something like that?
return concurrent_dict.GetOrAdd(key, k => ValueFactory(k));
Run Code Online (Sandbox Code Playgroud)带闭包的 Lambda:
// this is definitely an allocation
return concurrent_dict.GetOrAdd(key, k => ValueFactory(k, stuff));
Run Code Online (Sandbox Code Playgroud)外部检查(例如检查锁定前的条件):
// no lambdas in the hot path
if (!concurrent_dict.TryGetValue(key, out value))
return concurrent_dict.GetOrAdd(key, k => ValueFactory(k));
Run Code Online (Sandbox Code Playgroud)第三种情况显然不需要分配,第二种情况需要分配。
但是第一种情况(没有捕获的 lambda)是否完全不需要分配(至少在较新的 CLR 版本中)?另外,这是运行时的实现细节,还是标准指定的内容?
我是C#TPL和DataFlow的新手,我正在努力研究如何实现TPL DataFlow TransformManyBlock.我正在将其他一些代码翻译成DataFlow.我的(简化)原始代码是这样的:
private IEnumerable<byte[]> ExtractFromByteStream(Byte[] byteStream)
{
yield return byteStream; // Plus operations on the array
}
Run Code Online (Sandbox Code Playgroud)
在另一种方法中,我会这样称呼它:
foreach (byte[] myByteArray in ExtractFromByteStream(byteStream))
{
// Do stuff with myByteArray
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试创建一个TransformManyBlock来生成来自较大输入数组(实际上是二进制流)的多个小数组(实际上是数据包),因此in和out都是类型byte[].
我尝试了下面的内容,但我知道我错了.我想使用与以前相同的函数构造这个块,并且只是将TransformManyBlock它包裹起来.我收到一个错误"这个电话很模糊......"
var streamTransformManyBlock = new TransformManyBlock<byte[], byte[]>(ExtractFromByteStream);
Run Code Online (Sandbox Code Playgroud)