繁体   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