[英]Extension method c#
class Program
{
public static int i = 0;
public static void Main()
{
(i++).Print();
}
}
static class Extensions
{
public static void Print(this int i)
{
Console.WriteLine(Program.i);
Console.WriteLine(i);
}
}
输出:1 0
为什么当我们仅传递i
它不会递增,而使用Program.i
会递增?
首先,请注意,这与作为扩展方法无关。
Main()中的代码与此相同:
public static void Main()
{
Extensions.Print(Program.i++);
}
这也会打印1和0。
为什么会发生这种情况的答案现在更加清楚:
i
的当前值,准备将其传递给Print()
。 Program.i
的值增加,因此现在它的值为1。 i
的未递增值调用Print()
。 Program.i
被打印,从而打印1。 i
被打印,因此打印0。 实际上,C#编译器将如下编译Main()
:
public static void Main()
{
int num = Program.i;
Program.i = num + 1;
num.Print();
}
或(在IL中):
.method public hidebysig static void Main () cil managed
{
.entrypoint
IL_0000: nop
IL_0001: ldsfld int32 Demo.Program::i
IL_0006: dup
IL_0007: ldc.i4.1
IL_0008: add
IL_0009: stsfld int32 Demo.Program::i
IL_000e: call void Demo.Extensions::Print(int32)
IL_0013: nop
IL_0014: ret
}
编译器执行此操作的原因是由于后递增运算符的定义。
按照定义, Extensions.Print(Program.i++)
必须使用Program.i
的值(增加之前的值Extensions.Print(Program.i++)
进行调用。
实际上,您的i
在Print()
方法调用之后递增 ( 后缀递增操作 ,请参见++运算符 ),这就是为什么您的输出为'0'的原因,您需要在调用Print()
之前将其递增( 前缀递增操作 ):
(++i).Print();
与Console.WriteLine(i);
。
您可以检查是否在循环中调用它,例如:
public static void Main()
{
for (int a = 0; a < 10; a++)
{
(i++).Print();
}
}
static class Extensions
{
public static void Print(this string i)
{
Console.WriteLine(i);
}
}
您将获得输出:
输出:0 1 2 3 4 5 6 7 8 9
但是,如果在Print()
方法调用之前使i
递增,则结果将是:
输出:1 2 3 4 5 6 7 8 9 10
并且您的Program.i
1,因为它的调用发生在Print()
方法内,并且此时Program
的i
将增加。
您的输出为0,因为它在递增程序变量之前执行该方法。
这是如何将1作为输出^^
class Program
{
public static int i = 0;
static void Main(string[] args)
{
i++;
i.Print();
}
}
static class Extensions
{
public static void Print(this int i)
{
Console.WriteLine(Program.i);
Console.WriteLine(i);
}
}
这是因为您使用的是后固定增量,这意味着在执行打印方法后该值将递增
class Program
{
public static int i = 0;
public static void Main()
{
(i++).Print();// increment after print
(++i).Print();// print after increment
}
}
static class Extensions
{
public static void Print(this int i)
{
Console.WriteLine(i);
}
}
淘汰
0
2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.