Kutulama (C++/CLI ve C++/CX)
Değer türlerinin nesnelere dönüştürülmesi kutulama ve nesnelerin değer türlerine dönüştürülmesi de kutulama olarak adlandırılır.
Tüm Çalışma Zamanları
(Bu dil özelliği için tüm çalışma zamanları için geçerli olan hiçbir açıklama yoktur.)
Windows Çalışma Zamanı
C++/CX, kutulama değer türleri ve kutulama başvuru türleri için kısa söz dizimlerini destekler. değer türü türünde bir değişkene Object
atandığında kutulanır. Bir Object
değişken, bir değer türü değişkenine atandığında ve kutulanmamış tür parantez içinde belirtildiğinde, yani nesne değişkeni bir değer türüne atandığında gelen kutusu kaldırılır.
Platform::Object^
object_variable = value_variable;
value_variable = (value_type) object_variable;
Gereksinimler
Derleyici seçeneği: /ZW
Örnekler
Aşağıdaki kod örneği bir değeri kutular DateTime
ve kutuları açar. İlk olarak, örnek geçerli tarih ve saati temsil eden bir DateTime
değer alır ve bunu bir DateTime
değişkene atar. DateTime
Ardından, bir Object
değişkene atanarak kutulanır. Son olarak, kutulanan değer başka bir DateTime
değişkene atanarak kutulanmamış olur.
Örneği test etmek için bir BlankApplication
proje oluşturun, yöntemini değiştirin BlankPage::OnNavigatedTo()
ve ardından kapanış köşeli ayracında kesme noktaları ve değişkenine str1
atama belirtin. Örnek kapanış köşeli ayracına ulaştığında öğesini inceleyin 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());
}
Daha fazla bilgi için bkz . Boxing (C++/CX).
Ortak Dil Çalışma Zamanı
Derleyici kutuları için değer türleri Object. Bu, değer türlerini Objectdeğerine dönüştürmek için derleyici tanımlı bir dönüştürme nedeniyle mümkündür.
Kutulama ve kutulama, değer türlerinin nesne olarak değerlendirilmesini sağlar. Hem yapı türleri hem de int gibi yerleşik türler dahil olmak üzere değer türleri türüne ve türünden Objectdönüştürülebilir.
Daha fazla bilgi için bkz.
Gereksinimler
Derleyici seçeneği: /clr
Örnekler
Aşağıdaki örnekte örtük kutulamanın nasıl çalıştığı gösterilmektedir.
// 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^)