Değer Sınıfları ve Yapıları (C++/CX)

Değer yapısı veya değer sınıfı, Windows Çalışma Zamanı uyumlu poddur ("düz eski veri yapısı"). Sabit bir boyuta sahiptir ve yalnızca alanlardan oluşur; ref sınıfından farklı olarak hiçbir özelliği yoktur.

Aşağıdaki örneklerde, değer yapılarını bildirme ve başlatma işlemleri gösterilmektedir.

// in mainpage.xaml.h:
    value struct TestStruct
    {
        Platform::String^ str;
        int i;
    };

    value struct TestStruct2
    {
        TestStruct ts;
        Platform::String^ str;
        int i;
    };

// in mainpage.cpp:
    // Initialize a value struct with an int and String
    TestStruct ts = {"I am a TestStruct", 1};

    // Initialize a value struct that contains
    // another value struct, an int and a String
    TestStruct2 ts2 = {{"I am a TestStruct", 1}, "I am a TestStruct2", 2};

    // Initialize value struct members individually.
    TestStruct ts3;
    ts3.i = 108;
    ts3.str = "Another way to init a value struct.";

Değer türündeki bir değişken başka bir değişkene atandığında, değer kopyalanır, böylece iki değişkenin her biri kendi veri kopyasına sahip olur. Değer yapısı, yalnızca genel veri alanlarını içeren sabit boyutlu bir yapıdır ve anahtar sözcüğü kullanılarak value struct bildirilir.

Değer sınıfı, alanları için açıkça genel erişilebilirlik verilmesi gereken bir value struct sınıf gibidir. Anahtar sözcüğü kullanılarak bildirildi value class .

Değer yapısı veya değer sınıfı yalnızca temel sayısal türler, numaralandırma sınıfları Platform::String^veya Platform::IBox <T>^ alanları içerebilir; burada T sayısal bir tür veya sabit listesi sınıfı ya da değer sınıfı ya da yapısıdır. Bir IBox<T>^ alanın değeri nullptrolabilir; C++ null atanabilir değer türleri kavramını bu şekilde uygular.

Üye olarak veya türü içeren bir Platform::String^ değer sınıfı veya IBox<T>^ değer yapısı -able değildir memcpy.

Veya'nın value classvalue struct tüm üyeleri genel olduğundan ve meta verilerde yayıldığından, standart C++ türlerine üye olarak izin verilmez. Bu, veya internal standart C++ türlerini içerebilen private başvuru sınıflarından farklıdır..

Aşağıdaki kod parçası ve City türlerini değer yapıları olarak bildirirCoordinates. Veri üyelerinden City birinin bir GeoCoordinates tür olduğuna dikkat edin. A value struct , diğer değer yapılarını üye olarak içerebilir.

public enum class Continent 
{  
    Africa,
    Asia,
    Australia,
    Europe,
    NorthAmerica,
    SouthAmerica,
    Antarctica 
};

value struct GeoCoordinates
{
    double Latitude; //or float64 if you prefer
    double Longitude;
};

value struct City
{
    Platform::String^ Name;
    int Population;
    double AverageTemperature;
    GeoCoordinates Coordinates;
    Continent continent;
};

Değer türleri için parametre geçirme

İşlev veya yöntem parametresi olarak bir değer türünüz varsa, normalde değere göre geçirilir. Daha büyük nesneler için bu bir performans sorununa neden olabilir. Visual Studio 2013 ve önceki sürümlerde, C++/CX içindeki değer türleri her zaman değere göre geçirildi. Visual Studio 2015 ve sonraki sürümlerinde, değer türlerini başvuruya veya değere göre geçirebilirsiniz.

Değer türünü değere göre geçiren bir parametreyi bildirmek için aşağıdaki gibi bir kod kullanın:

void Method1(MyValueType obj);

Bir değer türünü başvuruya göre geçiren bir parametreyi bildirmek için, aşağıdaki gibi başvuru simgesini (&) kullanın:

void Method2(MyValueType& obj);

Method2 içindeki tür, MyValueType'a bir başvurudur ve standart C++ dilindeki başvuru türüyle aynı şekilde çalışır.

C# gibi başka bir dilden Method1'i çağırdığınızda veya out anahtar sözcüğünü ref kullanmanız gerekmez. Method2'yi çağırdığınızda anahtar sözcüğünü ref kullanın.

Method2(ref obj);

Başvuruya göre bir değer türü geçirmek için işaretçi simgesi (*) de kullanabilirsiniz. Diğer dillerdeki arayanlara göre davranış aynıdır (C# dilinde arayanlar anahtar sözcüğünü kullanır ref ), ancak yönteminde tür, değer türüne yönelik bir işaretçidir.

Boş değer atanabilen değer türleri

Daha önce belirtildiği gibi, bir değer sınıfı veya değer yapısı Platform::IBox T^türünde bir alana sahip olabilir; örneğin, IBox<int>^.>< Böyle bir alan türü için geçerli olan herhangi bir sayısal değere int veya değerine nullptrsahip olabilir. Null atanabilir bir alanı, parametresi isteğe bağlı olarak bildirilen bir yönteme veya değer türünün bir değere sahip olması gerekmeyen başka bir yere bağımsız değişken olarak geçirebilirsiniz.

Aşağıdaki örnekte, boş değer atanabilir alanı olan bir yapının nasıl başlatıldığını gösterilmektedir.

public value struct Student
{
    Platform::String^ Name;
    int EnrollmentYear;
    Platform::IBox<int>^ GraduationYear; // Null if not yet graduated.
};
//To create a Student struct, one must populate the nullable type.
MainPage::MainPage()
{
    InitializeComponent();

    Student A;
    A.Name = "Alice";
    A.EnrollmentYear = 2008;
    A.GraduationYear = ref new Platform::Box<int>(2012);

    Student B;
    B.Name = "Bob";
    B.EnrollmentYear = 2011;
    B.GraduationYear = nullptr;

    IsCurrentlyEnrolled(A);
    IsCurrentlyEnrolled(B);
}
bool MainPage::IsCurrentlyEnrolled(Student s)
{
    if (s.GraduationYear == nullptr)
    {
        return true;
    }
    return false;
}

Bir değer yapısı, burada gösterildiği gibi aynı şekilde null atanabilir hale getirilebilir:

public value struct MyStruct
{
public:
    int i;
    Platform::String^ s;
};

public ref class MyClass sealed
{
public:
    property Platform::IBox<MyStruct>^ myNullableStruct;
};

Ayrıca bkz.

Tür Sistemi (C++/CX)
C++/CX Dil Başvurusu
Ad Alanları Başvurusu
Başvuru Sınıfları ve Yapıları (C++/CX)