扩展方法c#

时间:2017-11-02 12:37:29

标签: 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会递增?

4 个答案:

答案 0 :(得分:1)

首先,请注意,这与扩展方法无关。

Main()中的代码与此相同:

x & y %in% c(3,4)

这也会打印1和0。

为什么会发生这种情况的答案现在更加明确:

  1. 捕获public static void Main() { Extensions.Print(Program.i++); } ,0的当前值,准备将其传递给i
  2. Print()的值递增,现在它的值为1.
  3. 使用未增加的Program.i。值调用
  4. Print() 打印
  5. i,从而打印1。
  6. 打印参数Program.i,从而打印0。
  7. 实际上,C#编译器将按如下方式编译i

    Main()

    或(在IL中):

    public static void Main()
    {
        int num = Program.i;
        Program.i = num + 1;
        num.Print();
    }
    

    编译器执行此操作的原因是由于增量后运算符的定义。

    根据定义,

    .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++)的值进行调用,因为它是在增加之前的。{/ p>

答案 1 :(得分:1)

实际上,在i方法调用(后缀增量操作,请参阅++ Operator)后,您的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

但如果您在i方法调用之前增加Print(),结果将为:

  

输出:1 2 3 4 5 6 7 8 9 10

并且您的Program.i获得1,因为其调用是在Print()方法内进行的,并且在该点Program&#39; s i将会增加。

答案 2 :(得分:0)

您的输出为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);
    }
}

答案 3 :(得分:0)

这是因为您正在使用修复后增量,这意味着在执行print方法后该值会增加

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);
    }
}

out put

0

2