簡體   English   中英

擴展方法C#

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

為什么會發生這種情況的答案現在更加清楚:

  1. 捕獲i的當前值,准備將其傳遞給Print()
  2. Program.i的值增加,因此現在它的值為1。
  3. 使用i的未遞增值調用Print()
  4. Program.i被打印,從而打印1。
  5. 參數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++)進行調用。

實際上,您的iPrint()方法調用之后遞增后綴遞增操作 ,請參見++運算符 ),這就是為什么您的輸出為'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()方法內,並且此時Programi將增加。

您的輸出為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM