Bagikan melalui


Kelas dan struktur nilai (C++/CX)

Struktur nilai atau kelas nilai adalah POD yang kompatibel dengan Windows Runtime ("struktur data lama biasa"). Ini memiliki ukuran tetap dan hanya terdiri dari bidang; tidak seperti kelas ref, itu tidak memiliki properti.

Contoh berikut menunjukkan cara mendeklarasikan dan menginisialisasi struktur nilai.

// 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.";

Ketika variabel jenis nilai ditetapkan ke variabel lain, nilai disalin, sehingga masing-masing dari dua variabel memiliki salinan datanya sendiri. Struktur nilai adalah struktur ukuran tetap yang hanya berisi bidang data publik dan dideklarasikan dengan menggunakan value struct kata kunci.

Kelas nilai sama seperti value struct kecuali bahwa bidangnya harus secara eksplisit diberikan aksesibilitas publik. Ini dinyatakan dengan menggunakan value class kata kunci.

Struktur nilai atau kelas nilai dapat berisi sebagai bidang hanya jenis numerik dasar, kelas enum, Platform::String^, atau Platform::IBox <T>^ di mana T adalah jenis numerik atau kelas enum atau kelas nilai atau struktur. Bidang IBox<T>^ dapat memiliki nilai nullptr—ini adalah bagaimana C++ mengimplementasikan konsep jenis nilai yang dapat diubah ke null.

Kelas nilai atau struktur nilai yang berisi Platform::String^ atau IBox<T>^ mengetik sebagai anggota tidak memcpydapat.

Karena semua anggota value class atau value struct bersifat publik dan dipancarkan ke dalam metadata, jenis C++ standar tidak diizinkan sebagai anggota. Ini berbeda dari kelas ref, yang mungkin berisi private atau internal jenis C++ standar..

Fragmen kode berikut mendeklarasikan Coordinates jenis dan City sebagai struktur nilai. Perhatikan bahwa salah City satu anggota data adalah GeoCoordinates jenis. value struct dapat berisi struktur nilai lain sebagai anggota.

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;
};

Pengelompokan parameter untuk jenis nilai

Jika Anda memiliki jenis nilai sebagai parameter fungsi atau metode, biasanya diteruskan oleh nilai. Untuk objek yang lebih besar, ini dapat menyebabkan masalah performa. Di Visual Studio 2013 dan yang lebih lama, jenis nilai di C++/CX selalu diteruskan oleh nilai. Di Visual Studio 2015 dan yang lebih baru, Anda dapat meneruskan jenis nilai berdasarkan referensi atau berdasarkan nilai.

Untuk mendeklarasikan parameter yang meneruskan jenis nilai menurut nilai, gunakan kode seperti berikut:

void Method1(MyValueType obj);

Untuk mendeklarasikan parameter yang meneruskan jenis nilai menurut referensi, gunakan simbol referensi (&), seperti dalam hal berikut:

void Method2(MyValueType& obj);

Jenis di dalam Method2 adalah referensi ke MyValueType dan berfungsi dengan cara yang sama seperti jenis referensi di C++standar.

Saat Anda memanggil Method1 dari bahasa lain, seperti C#, Anda tidak perlu menggunakan ref kata kunci atau out . Saat Anda memanggil Method2, gunakan ref kata kunci.

Method2(ref obj);

Anda juga dapat menggunakan simbol penunjuk (*) untuk meneruskan jenis nilai menurut referensi. Perilaku sehubungan dengan pemanggil dalam bahasa lain sama (penelepon di C# menggunakan ref kata kunci), tetapi dalam metode , jenisnya adalah penunjuk ke jenis nilai.

Jenis nilai yang dapat diubah ke null

Seperti disebutkan sebelumnya, kelas nilai atau struktur nilai dapat memiliki bidang jenis Platform::IBox<T>^—misalnya, IBox<int>^. Bidang semacam itu dapat memiliki nilai numerik apa pun yang valid untuk jenis tersebut int , atau dapat memiliki nilai nullptr. Anda dapat meneruskan bidang nullable sebagai argumen ke metode yang parameternya dinyatakan sebagai opsional, atau di tempat lain bahwa jenis nilai tidak diperlukan untuk memiliki nilai.

Contoh berikut menunjukkan cara menginisialisasi struct yang memiliki bidang nullable.

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;
}

Struktur nilai itu sendiri dapat dibuat nullable dengan cara yang sama, seperti yang ditunjukkan di sini:

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

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

Baca juga

Sistem Tipe (C++/CX)
Referensi Bahasa C++/CX
Referensi Namespace
Kelas dan struktur ref (C++/CX)