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 Objectatandığı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 str1atama 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^)

Ayrıca bkz.

.NET ve UWP İçin Bileşen Uzantıları