Saya pikir banyak orang menjadi bingung di sini, masalah khusus ini berkaitan dengan pemahaman bahwa properti tipe nilai mengembalikan salinan tipe nilai (seperti dengan metode dan pengindeks), dan bidang tipe nilai diakses secara langsung . Kode berikut melakukan persis apa yang Anda coba capai dengan mengakses bidang dukungan properti secara langsung (catatan: mengekspresikan properti dalam bentuk verbose dengan bidang dukungan adalah setara dengan properti otomatis, tetapi memiliki keuntungan bahwa dalam kode kami, kami dapat mengakses bidang dukungan secara langsung):
class Program
{
static void Main(string[] args)
{
var myClass = new MyClass();
myClass.SetOrigin();
Debug.Assert(myClass.Origin.X == 10); //succeeds
}
}
class MyClass
{
private Point _origin;
public Point Origin
{
get => _origin;
set => _origin = value;
}
public void SetOrigin()
{
_origin.X = 10; //this works
//Origin.X = 10; // fails with CS1612;
}
}
Kesalahan yang Anda dapatkan adalah konsekuensi tidak langsung dari tidak memahami bahwa properti mengembalikan salinan tipe nilai. Jika Anda mengembalikan salinan tipe nilai dan Anda tidak menetapkannya ke variabel lokal maka setiap perubahan yang Anda buat pada salinan itu tidak akan pernah bisa dibaca dan oleh karena itu kompiler meningkatkan ini sebagai kesalahan karena ini tidak bisa disengaja. Jika kita menetapkan salinan ke variabel lokal maka kita dapat mengubah nilai X, tetapi itu hanya akan diubah pada salinan lokal, yang memperbaiki kesalahan waktu kompilasi, tetapi tidak akan memiliki efek yang diinginkan dari memodifikasi properti Origin. Kode berikut menggambarkan ini, karena kesalahan kompilasi hilang, tetapi pernyataan debug akan gagal:
class Program
{
static void Main(string[] args)
{
var myClass = new MyClass();
myClass.SetOrigin();
Debug.Assert(myClass.Origin.X == 10); //throws error
}
}
class MyClass
{
private Point _origin;
public Point Origin
{
get => _origin;
set => _origin = value;
}
public void SetOrigin()
{
var origin = Origin;
origin.X = 10; //this is only changing the value of the local copy
}
}