Definisi class atau struct seperti blueprint yang menentukan tipe data yang dapat dilakukan. Objek pada dasarnya adalah blok memori yang telah dialokasikan dan dikonfigurasi sesuai dengan blue print. Sebuah program dapat membuat banyak objek dari class yang sama.
Objek juga disebut instances, dan dapat disimpan dalam variabel atau dalam array atau collection. Clint code adalah code yang menggunakan variabel ini untuk memanggil metod dan mengakses properti publik objek.
Dalam bahasa berorientasi objek seperti C #, sebuah program tipikal terdiri dari beberapa objek yang berinteraksi secara dinamis.
- Struct Instances vs. Class Instances
Dalam contoh berikut, Person adalah tipe data dan person1 dan person 2 adalah instance, atau objek, dari tipe itu.
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public Person(string name, int age)
{
Name = name;
Age = age;
}
//Other properties, methods, events...
}
class Program
{
static void Main()
{
Person person1 = new Person("Leopold", 6);
Console.WriteLine("person1 Name = {0} Age = {1}", person1.Name, person1.Age);
// Declare new person, assign person1 to it.
Person person2 = person1;
//Change the name of person2, and person1 also changes.
person2.Name = "Molly";
person2.Age = 16;
Console.WriteLine("person2 Name = {0} Age = {1}", person2.Name, person2.Age);
Console.WriteLine("person1 Name = {0} Age = {1}", person1.Name, person1.Age);
// Keep the console open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
/*
Output:
person1 Name = Leopold Age = 6
person2 Name = Molly Age = 16
person1 Name = Molly Age = 16
*/
Karena struct adalah value types, variabel dari objek struct menyimpan salinan
keseluruhan objek. Instances struct juga dapat dibuat dengan menggunakan
operator baru, tapi ini tidak diperlukan, seperti yang ditunjukkan pada
contoh berikut:
public struct Person
{
public string Name;
public int Age;
public Person(string name, int age)
{
Name = name;
Age = age;
}
}
public class Application
{
static void Main()
{
// Create struct instance and initialize by using "new".
// Memory is allocated on thread stack.
Person p1 = new Person("Alex", 9);
Console.WriteLine("p1 Name = {0} Age = {1}", p1.Name, p1.Age);
// Create new struct object. Note that struct can be initialized
// without using "new".
Person p2 = p1;
// Assign values to p2 members.
p2.Name = "Spencer";
p2.Age = 7;
Console.WriteLine("p2 Name = {0} Age = {1}", p2.Name, p2.Age);
// p1 values remain unchanged because p2 is copy.
Console.WriteLine("p1 Name = {0} Age = {1}", p1.Name, p1.Age);
// Keep the console open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
/*
Output:
p1 Name = Alex Age = 9
p2 Name = Spencer Age = 7
p1 Name = Alex Age = 9
*/
Memori untuk kedua p1 dan p2 dialokasikan pada tumpukan benang.
Ingatan itu direklamasi bersamaan dengan tipe data atau metode di mana ia di declared.
Inilah salah satu alasan mengapa struct disalin pada tugas.Sebaliknya, memori yang dialokasikan untuk instance class secara otomatis direklamasi (pengumpulan sampah) oleh runtime bahasa umum ketika semua referensi ke objek telah hilang dari ruang lingkup. Hal ini tidak mungkin untuk secara deterministik menghancurkan objek kelas seperti Kita bisa di C ++.
- Object Identity vs. Value Equality
Jika kita berniat untuk membandingkan nilai, kita harus mempertimbangkan apakah objek adalah contoh tipe nilai (struct) atau tipe referensi (class, delegasi, array).
1. Untuk menentukan apakah dua contoh kelas merujuk ke lokasi yang sama di memori (yang berarti
bahwa mereka memiliki identitas yang sama), gunakan metode Setara statis.
(System.Object adalah kelas dasar implisit untuk semua value type dan tipe data referensi,
termasuk struct dan class yang ditentukan pengguna.)
2. Untuk menentukan apakah bidang contoh dalam dua contoh struct memiliki nilai yang sama,
gunakan metode ValueType.Equals. Karena semua struct secara implisit mewarisi dari
System.ValueType, Kita memanggil metode ini secara langsung pada objek kita seperti yang
ditunjukkan pada contoh berikut:
// Person is defined in the previous example.
//public struct Person
//{
// public string Name;
// public int Age;
// public Person(string name, int age)
// {
// Name = name;
// Age = age;
// }
//}
Person p1 = new Person("Wallace", 75);
Person p2;
p2.Name = "Wallace";
p2.Age = 75;
if (p2.Equals(p1))
Console.WriteLine("p2 and p1 have the same values.");
// Output: p2 and p1 have the same values.
Implementasi System.ValueType Equals menggunakan refleksi karena harus
dapat menentukan bidang apa yang ada dalam struct apapun.Saat membuat struct kita sendiri, override metod Equals untuk menyediakan algoritma kesetaraan yang efisien yang spesifik untuk tipe data kita.
ConversionConversion EmoticonEmoticon