using System;
using System.Collections.Generic;
using System.Linq;
namespace PropertySample
{
class Program
{
static void Main(string[] args)
{
Calculator calculator = new Calculator();
Action action1 = calculator.Report; //
Action action2 = new Action(calculator.Report); //
action1();
action2();
}
}
class Calculator
{
public void Report()
{
Console.WriteLine("I have 3 methods.");
}
}
}
請教一下 程式中畫斜線的兩句程式都可以實作一樣的委托效果,但是這兩句有什么區別?感謝
uj5u.com熱心網友回復:
沒有區別,結帖把。(非混分,的確沒有區別。)uj5u.com熱心網友回復:
沒區別,用第一種就行了,第二種是出現Action之前的寫法uj5u.com熱心網友回復:
我相信你的結論。
不過對問者來說,或許得出結論的方法,更有價值。
Dotnet有反編輯的工具,利用該工具我們可以知道編譯器把C#代碼轉換成什么樣的il中間代碼:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 41 (0x29)
.maxstack 3
.locals init ([0] class [mscorlib]System.Action action1)
IL_0000: newobj instance void PropertySample.Calculator::.ctor()
IL_0005: dup
IL_0006: ldftn instance void PropertySample.Calculator::Report()
IL_000c: newobj instance void [mscorlib]System.Action::.ctor(object,
native int)
IL_0011: stloc.0
IL_0012: ldftn instance void PropertySample.Calculator::Report()
IL_0018: newobj instance void [mscorlib]System.Action::.ctor(object,
native int)
IL_001d: ldloc.0
IL_001e: callvirt instance void [mscorlib]System.Action::Invoke()
IL_0023: callvirt instance void [mscorlib]System.Action::Invoke()
IL_0028: ret
} // end of method Program::Main
其中
IL_0006: ldftn 用來得到一個方法指標。
IL_000c: newobj 呼叫Action的建構式,來創建一個delegate。
...
IL_0012: ldftn 用來得到一個方法指標。
IL_0018: newobj 呼叫Action的建構式,來創建一個delegate。
可以看到,C#里的兩種寫法,編譯成中間代碼后,是一樣的。
C#編譯器比較貼心,讓我們少輸些代碼,action1的創建方法底層上就是action2的創建方法。
另外,你可以用任何反編譯工具,dotnet自帶的有ildasm.exe,可以在類似如下路徑找到:
C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\ildasm.exe
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/31282.html
標籤:C#
