[英]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.