Gjennomgang av artikler om refleksjoner:
Om EMIT-anmeldelsen:
Først, lag et enkelt objekt, instansier objektet, og bruk emit og uttrykk for å lese og endre objektets verdi, og du kan se at utførelsesresultatet er som forventet, som vist i figuren under:
Benchmark bruker BenchmarkDotNet for benchmarking, leser kun objektverdier for testing, kjører på Net472 og NetCoreApp31, testresultatene er som følger:
Sammendrag:
Både emit og uttrykk er mer effektive enn å bruke refleksjon for å hente verdier, og under .NET 4.7.2-rammeverket er emitt bedre enn uttrykksutførelseseffektivitet, men under .NET Core 3.1-rammeverket er uttrykk bedre enn emitt-utførelse.
Hvis programmet ditt bare trenger å kjøre et objekt dynamisk én gang, anbefales det å bruke refleksjon (det er tross alt ikke nødvendig å kapsle inn igjen eller opprette en delegat), og hvis programmet ditt må kjøre et objekt dynamisk flere ganger, anbefales det å bruke emit eller uttrykk, og selvfølgelig kreves ytterligere innkapsling.
Testkoden er som følger:
Når man bruker Expression for å hente objektverdier, rapporteres feilen som følger:
Uttrykk av typen 'System.Int32' kan ikke brukes for returtypen 'System.Object' Jeg skjønner virkelig ikke hvordan disse folkene bruker det, de kan bare kopiere og lime inn!
|