C# 什么功能<;int,int>;这样做?
样本1:C# 什么功能<;int,int>;这样做?,c#,C#,样本1: static void DelegateTest() { Func<int, int> test = null; for(int i=0;i<2;i++) { int y = i; test = (t) => y; } Console.WriteLine(test(1)); // This thing prints 1 //Console.ReadLine(); } static void DelegateTest()
static void DelegateTest()
{
Func<int, int> test = null;
for(int i=0;i<2;i++)
{
int y = i;
test = (t) => y;
}
Console.WriteLine(test(1)); // This thing prints 1
//Console.ReadLine();
}
static void DelegateTest()
{
Func test=null;
对于(int i=0;i y;
}
Console.WriteLine(test(1));//这个东西打印1
//Console.ReadLine();
}
样本2:
static void DelegateTest2()
{
Func<int, int> test = null;
for (int i = 0; i < 2; i++)
{
test = (t) => i;
}
// This thing prints 2. I want to know why?
//Because 'i' gets out of scope when test(1) gets called and it should print 1
Console.WriteLine(test(1));
Console.ReadLine();
static void DelegateTest2()
{
Func test=null;
对于(int i=0;i<2;i++)
{
测试=(t)=>i;
}
//这东西印的是2,我想知道为什么?
//因为调用测试(1)时,“i”超出范围,它应该打印1
控制台写入线(测试(1));
Console.ReadLine();
我想知道为什么当我们在范围外调用Func时,它会得到I的增量值?因为两个循环的
I
的最后一个值都是2
。在第一个循环中,最后一步不会执行,因为循环条件求值为false,因为I
变为2。这就是为什么y
从未分配给2
的原因>。在第二个代码段中,lambda捕获了i
的最后一个值,即2
,这就是它打印2的原因
您正在将1
传递给您的方法,但这并不重要。即使您传递了不同的值,您仍然会得到相同的结果。这一切都是关于
如果您仍有疑问,并且希望确定y
和i
的最后值是多少,您可以进行另一个简单测试:
int y = 0;
for (int k = 0; k < 2; k++)
{
y = k;
}
Console.WriteLine(y); // writes 1
int i = 0;
for(; i < 2; i++) { }
Console.WriteLine(i); // writes 2
inty=0;
对于(int k=0;k<2;k++)
{
y=k;
}
Console.WriteLine(y);//写入1
int i=0;
对于(;i<2;i++){}
Console.WriteLine(i);//写入2
在第二个示例中(实际上,在两个示例中),您创建了一个名为的对象。当您将变量用作lambda语句或在lambda/delegate外部定义的匿名委托的一部分时,就会创建一个闭包。此闭包捕获了(关闭)for
循环中的i
变量,防止其“超出范围”。在中断循环的条件失败之前,for
循环必须将该i
变量最后一次增加一次,使其变为2
,因此最终得到的是2
,而不是1
第一个示例对y
变量执行相同的操作。您仍然捕获/关闭该变量,并防止其超出范围。但是,y
变量从未设置为2
。该示例中的i
变量仍会增加到2
,但在此之后,代码不会变为t循环,因此y
永远不会设置为2
,这样您仍然可以看到1
的预期结果
在这两种情况下,传递给该方法的
1
值从未使用过,也没有任何效果。Pro提示:在这里发布代码图像而不是代码的格式化文本被认为是非常粗鲁的。您的代表级别足够高,您现在应该知道得更清楚了。@JoelCoehoorn对图像感到抱歉。下次我会处理它。来吧,我会的希望您多次知道这是一个重复。我确实理解这一点,但是您的for循环会产生疑问。您已经创建了for循环外的变量,所以它不会超出范围。但是如果您为(int I=0;i@dotnetstep它与(int i=0;i)的没有什么不同