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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk