IsByValue Klasa

Definicja

Wskazuje, że zmodyfikowany argument metody powinien być interpretowany jako semantyka obiektu przekazywanego według wartości. Ten modyfikator jest stosowany do typów referencyjnych. Klasa ta nie może być dziedziczona.

public ref class IsByValue abstract sealed
public static class IsByValue
type IsByValue = class
Public Class IsByValue
Dziedziczenie
IsByValue

Przykłady

W poniższym przykładzie pokazano, jak emitować IsByValue obiekt do zestawu przy użyciu odbicia.



#using <mscorlib.dll>

using namespace System;
using namespace System::Reflection;
using namespace System::Reflection::Emit;
using namespace System::Runtime::CompilerServices;
using namespace System::Threading;


ref class CodeEmitter
{
private:
    AssemblyBuilder^ asmBuilder;
    String^ asmName;
    ModuleBuilder^ modBuilder;


    void prepareAssembly(String^ name){
        
        // Check the input.
        if(!name){
        
            throw gcnew ArgumentNullException("AssemblyName");
        }

        asmName = name;

        // Create an AssemblyName object and set the name.
        AssemblyName^ asmName = gcnew AssemblyName();

        asmName->Name = name;

        // Use the AppDomain class to create an AssemblyBuilder instance.

        AppDomain^ currentDomain = Thread::GetDomain();

        asmBuilder = currentDomain->DefineDynamicAssembly(asmName,AssemblyBuilderAccess::RunAndSave);

        // Create a dynamic module.
        modBuilder = asmBuilder->DefineDynamicModule(name);
    }


public:

    // Constructor.
    CodeEmitter(String ^ AssemblyName){

        prepareAssembly(AssemblyName);
    }

    // Create a new type.
    TypeBuilder^ CreateType(String^ name){
       
        // Check the input.
        if(!name){
        
            throw gcnew ArgumentNullException("AssemblyName");
        }

        return modBuilder->DefineType( name );
    }

    // Write the assembly.
    void WriteAssembly(MethodBuilder^ entryPoint){
    
        // Check the input.
        if(!entryPoint){
        
            throw gcnew ArgumentNullException("entryPoint");
        }

        asmBuilder->SetEntryPoint( entryPoint );
        asmBuilder->Save( asmName );
    }

};

void main()
{

    // Create a CodeEmitter to handle assembly creation.
    CodeEmitter ^ e = gcnew CodeEmitter("program.exe");

    // Create a new type.
    TypeBuilder^ mainClass = e->CreateType("MainClass");
    
    // Create a new method.
    MethodBuilder^ mBuilder = mainClass->DefineMethod("mainMethod", MethodAttributes::Static);

    // Create an ILGenerator and emit IL for 
    // a simple "Hello World." program.
    ILGenerator^ ilGen = mBuilder->GetILGenerator();

    ilGen->Emit(OpCodes::Ldstr, "Hello World");

    array<Type^>^mType = {String::typeid};

    MethodInfo^ writeMI = Console::typeid->GetMethod( "WriteLine", mType );

    ilGen->EmitCall(OpCodes::Call, writeMI, nullptr );

    ilGen->Emit( OpCodes::Ret );

    /////////////////////////////////////////////////
    /////////////////////////////////////////////////
    // Apply a required custom modifier
    // to a field.
    /////////////////////////////////////////////////
    /////////////////////////////////////////////////

    array<Type^>^fType = {IsByValue::typeid};

    mainClass->DefineField("modifiedInteger", Type::GetType("System.Int32"), fType, nullptr, FieldAttributes::Private);

    // Create the type.
    mainClass->CreateType();

    // Write the assembly using a reference to 
    // the entry point.
    e->WriteAssembly(mBuilder);

    Console::WriteLine(L"Assembly created.");
}

Uwagi

Klasa IsByValue jest używana przez kompilator języka Microsoft C++ do oznaczania parametrów metody i zwracania wartości, których semantyka jest zgodne z regułami języka C++ dla obiektów przekazywanych przez wartość.

Kompilatory emitują niestandardowe modyfikatory w metadanych, aby zmienić sposób, w jaki kompilator just in time (JIT) obsługuje wartości, gdy zachowanie domyślne nie jest odpowiednie. Gdy kompilator JIT napotka modyfikator niestandardowy, obsługuje wartość w sposób określony przez modyfikatora. Kompilatory mogą stosować modyfikatory niestandardowe do metod, parametrów i zwracanych wartości. Kompilator JIT musi reagować na wymagane modyfikatory, ale może ignorować opcjonalne modyfikatory.

Niestandardowe modyfikatory można emitować do metadanych przy użyciu jednej z następujących technik:

Dotyczy