Saya sering menggunakan pendekatan ini dalam permainan C # /. NET saya sendiri. Selain manfaat lain (dan bahaya!) Yang dijelaskan di sini, ini juga dapat membantu menghindari masalah serialisasi.
Jika Anda ingin memanfaatkan fasilitas serialisasi biner .NET Framework bawaan, maka menggunakan ID entitas dapat membantu meminimalkan ukuran grafik objek yang ditulis. Secara default, pemformat biner .NET akan mengeluarkan serial seluruh objek grafik di tingkat bidang. Katakanlah saya ingin membuat serial sebuah Shipinstance. Jika Shipmemiliki _ownerbidang referensi Playersiapa yang memilikinya, maka Playerinstance itu akan keluar juga. Jika Playerberisi _shipsbidang (dari, katakanlah ICollection<Ship>), maka semua kapal pemain juga akan ditulis, bersama dengan benda lain yang dirujuk di tingkat bidang (secara rekursif). Sangat mudah untuk secara tidak sengaja membuat serial grafik objek yang besar ketika Anda hanya ingin membuat serialisasi satu bagian kecil saja.
Sebaliknya, jika saya memiliki _ownerIdbidang, maka saya bisa menggunakan nilai itu untuk menyelesaikan Playerreferensi sesuai permintaan. API publik saya bahkan dapat tetap tidak berubah, dengan Ownerproperti hanya melakukan pencarian.
Sementara pencarian berbasis hash umumnya sangat cepat, overhead yang ditambahkan bisa menjadi masalah untuk set entitas yang sangat besar dengan pencarian sering. Jika itu menjadi masalah bagi Anda, Anda bisa menyimpan referensi dengan menggunakan bidang yang tidak diserialisasi. Misalnya, Anda dapat melakukan sesuatu seperti ini:
public class Ship
{
private int _ownerId;
[NonSerialized] private Lazy<Player> _owner;
public Player Owner
{
get { return _owner.Value; }
}
public Ship(Player owner)
{
_ownerId = owner.PlayerID;
EnsureCache();
}
private void EnsureCache()
{
if (_owner == null)
_owner = new Lazy<Player>(() => Game.Current.Players[_ownerId]);
}
[OnDeserialized]
private void OnDeserialized(StreamingContext context)
{
EnsureCache();
}
}
Tentu saja, pendekatan ini juga dapat membuat serialisasi lebih sulit ketika Anda benar - benar ingin membuat serial objek grafik besar. Dalam hal ini, Anda perlu merancang semacam 'wadah' untuk memastikan bahwa semua benda yang diperlukan disertakan.