Bagikan melalui


Tinju (C++/CLI dan C++/CX)

Konversi jenis nilai ke objek disebut tinju, dan konversi objek ke jenis nilai disebut pembukaan kotak.

Semua Runtime

(Tidak ada keterangan untuk fitur bahasa ini yang berlaku untuk semua runtime.)

Windows Runtime

C++/CX mendukung sintaksis singkat untuk jenis nilai tinju dan jenis referensi pembuka kotak. Jenis nilai dikotak ketika ditetapkan ke variabel jenis Object. Variabel Object tidak dikotak saat ditetapkan ke variabel jenis nilai dan jenis yang tidak dikotak ditentukan dalam tanda kurung; yaitu, ketika variabel objek ditransmisikan ke jenis nilai.

  Platform::Object^
  object_variable  = value_variable;
value_variable = (value_type) object_variable;

Persyaratan

Opsi pengkompilasi: /ZW

Contoh

Contoh kode berikut menkotak dan membuka kotak nilai DateTime . Pertama, contoh mendapatkan DateTime nilai yang mewakili tanggal dan waktu saat ini dan menetapkannya ke DateTime variabel. Kemudian dikotak DateTime dengan menetapkannya ke Object variabel. Terakhir, nilai kotak tidak dikotak dengan menetapkannya ke variabel lain DateTime .

Untuk menguji contoh, buat BlankApplication proyek, ganti BlankPage::OnNavigatedTo() metode , lalu tentukan titik henti pada kurung siku penutup dan penugasan ke variabel str1. Ketika contoh mencapai tanda kurung siku penutup, periksa str1.

void BlankPage::OnNavigatedTo(NavigationEventArgs^ e)
{
    using namespace Windows::Globalization::DateTimeFormatting;

    Windows::Foundation::DateTime dt, dtAnother;
    Platform::Object^ obj1;

    Windows::Globalization::Calendar^ c =
        ref new Windows::Globalization::Calendar;
    c->SetToNow();
    dt = c->GetDateTime();
    auto dtf = ref new DateTimeFormatter(
                           YearFormat::Full,
                           MonthFormat::Numeric,
                           DayFormat::Default,
                           DayOfWeekFormat::None);
    String^ str1 = dtf->Format(dt);
    OutputDebugString(str1->Data());
    OutputDebugString(L"\r\n");

    // Box the value type and assign to a reference type.
    obj1 = dt;
    // Unbox the reference type and assign to a value type.
    dtAnother = (Windows::Foundation::DateTime) obj1;

    // Format the DateTime for display.
    String^ str2 = dtf->Format(dtAnother);
    OutputDebugString(str2->Data());
}

Untuk informasi selengkapnya, lihat Tinju (C++/CX).

Runtime Bahasa Umum

Pengkompilasi menampung jenis nilai ke Object. Ini dimungkinkan karena konversi yang ditentukan pengkompilasi untuk mengonversi jenis nilai menjadi Object.

Tinju dan pembukaan kotak memungkinkan jenis nilai diperlakukan sebagai objek. Jenis nilai, termasuk jenis struct dan jenis bawaan seperti int, dapat dikonversi ke dan dari jenis Object.

Untuk informasi selengkapnya, lihat:

Persyaratan

Opsi pengkompilasi: /clr

Contoh

Contoh berikut menunjukkan cara kerja tinju implisit.

// vcmcppv2_explicit_boxing2.cpp
// compile with: /clr
using namespace System;

ref class A {
public:
   void func(System::Object^ o){Console::WriteLine("in A");}
};

value class V {};

interface struct IFace {
   void func();
};

value class V1 : public IFace {
public:
   virtual void func() {
      Console::WriteLine("Interface function");
   }
};

value struct V2 {
   // conversion operator to System::Object
   static operator System::Object^(V2 v2) {
      Console::WriteLine("operator System::Object^");
      return (V2^)v2;
   }
};

void func1(System::Object^){Console::WriteLine("in void func1(System::Object^)");}
void func1(V2^){Console::WriteLine("in func1(V2^)");}

void func2(System::ValueType^){Console::WriteLine("in func2(System::ValueType^)");}
void func2(System::Object^){Console::WriteLine("in func2(System::Object^)");}

int main() {
   // example 1 simple implicit boxing
   Int32^ bi = 1;
   Console::WriteLine(bi);

   // example 2 calling a member with implicit boxing
   Int32 n = 10;
   Console::WriteLine("xx = {0}", n.ToString());

   // example 3 implicit boxing for function calls
   A^ a = gcnew A;
   a->func(n);

   // example 4 implicit boxing for WriteLine function call
   V v;
   Console::WriteLine("Class {0} passed using implicit boxing", v);
   Console::WriteLine("Class {0} passed with forced boxing", (V^)(v));   // force boxing

   // example 5 casting to a base with implicit boxing
   V1 v1;
   IFace ^ iface = v1;
   iface->func();

   // example 6 user-defined conversion preferred over implicit boxing for function-call parameter matching
   V2 v2;
   func1(v2);   // user defined conversion from V2 to System::Object preferred over implicit boxing
                // Will call void func1(System::Object^);

   func2(v2);   // OK: Calls "static V2::operator System::Object^(V2 v2)"
   func2((V2^)v2);   // Using explicit boxing: calls func2(System::ValueType^)
}
1

xx = 10

in A

Class V passed using implicit boxing

Class V passed with forced boxing

Interface function

in func1(V2^)

in func2(System::ValueType^)

in func2(System::ValueType^)

Baca juga

Ekstensi Komponen untuk .NET dan UWP