PEMBARUAN: Saya telah memperbaiki masalah yang saya alami tetapi saya tidak tahu mengapa bug tersebut menghasilkan jejak tumpukan seperti itu. Jejak tumpukan membawa saya ke arah yang salah. Jika ada yang bisa menjelaskan apa yang terjadi di sini saya akan sangat menghargainya (dan akan menandai jawaban Anda sebagai diterima). Perhatikan bahwa postingan asli saya telah dihapus.
Saya mengikuti kelas berikut. Bagian yang tidak relevan telah dihapus:
class ClassName {
private string[] _accountTypes = new string[2] {"ECOM", "MOTO"};
private Dictionary<string, string> _settleDueDateDictionary = new Dictionary<string, string>() {
{"0", "Process immediately."},
{"1", "Wait 1 day"},
{"2", "Wait 2 days"},
{"3", "Wait 3 days"},
{"4", "Wait 4 days"},
{"5", "Wait 5 days"},
{"6", "Wait 6 days"},
{"7", "Wait 7 days"},
};
private string _settleDueDate;
private string _accountTypeDescription;
public string SettleDueDate
{
get
{
DateTime today = DateTime.Today;
long settleDueDate = Convert.ToInt64(_settleDueDate);
return today.AddDays(settleDueDate).ToString("MM/dd/yyyy");
}
set
{
if (!_settleDueDateDictionary.ContainsKey(value)) {
// TODO - handle
}
_settleDueDate = value;
}
}
public string AccountTypeDescription
{
get {
//return AccountTypeDescription; // This would cause infinite recursion (not referring to backing property).
return _accountTypeDescription; // This fixed the StackOverflowException I was faxed with
}
set
{
if (!_accountTypes.Contains(value))
{
// TODO - handle
}
_accountTypeDescription = value;
}
}
}
Saya juga memiliki kelas ini yang mengambil instance dari kelas di atas dan membuat string XML menggunakan nilai dari instance:
class SecondClass
{
private ClassName classnameInstance;
public SecondClass(ClassName instance)
{
classnameInstance = instance;
}
public string PrepareRequest(XMLWriter writer)
{
writer.WriteElementString("accounttypedescription", classnameInstance.AccountTypeDescription);
}
}
Berikut adalah kode klien yang menghasilkan pelacakan tumpukan:
STPPData STPP = new STPPData();
STPP.SiteReference = _secureTradingWebServicesPaymentSettings.SiteReference;
STPP.Alias = _secureTradingWebServicesPaymentSettings.Alias;
STPP.SettleDueDate = Convert.ToString(_secureTradingWebServicesPaymentSettings.SettleDueDate);
STPP.SettleStatus = _secureTradingWebServicesPaymentSettings.SettleStatus;
STPPXml STPPXml = new STPPXml(STPP);
XmlWriterSettings settings = new XmlWriterSettings();
settings.Async = false;
var builder = new StringBuilder();
using (XmlWriter writer = XmlWriter.Create(builder, settings))
{
string xmlRequest = STPPXml.PrepareRequest(writer);
}
Terakhir, inilah jejak tumpukannya:
mscorlib.dll!string.GetHashCode()
mscorlib.dll!System.Collections.Generic.GenericEqualityComparer<System.__Canon>.GetHashCode(SYstem.__Canon obj)
mscorlib.dll!System.Collections.Generic.Dictionary<string,string>.FindEntry(string key)
mscorlib.dll!System.Collections.Generic.Dictionary<System.__Canon,System.__Canon>.ContainsKey(System.__Canon key)
ClassName.SettleDueDate.set(string value)
ClassName.SettleDueDate.set(string value)
ClassName.SettleDueDate.set(string value)
// Infinite recursion of this call
Pelacakan tumpukan ini membuat saya yakin bahwa saya telah salah mengimplementasikan pengambil/penyetel untuk STPP.SettleDueDate. Saya memeriksanya dan variabel pendukung dll. sudah benar (penyebab umum loop di getter/setter, saya mengerti). Proses debug lebih lanjut menunjukkan kepada saya bahwa pelacakan tumpukan sebenarnya dihasilkan ketika baris PrepareRequest()
ini dipanggil:
writer.WriteElementString("accounttypedescription", STPPData.AccountTypeDescription);
Saya menemukan bahwa saya salah menerapkan pengambil untuk STPPData.AccountTypeDescription karena saya telah membuat properti pendukung yang saya gunakan di penyetel tetapi saya TIDAK menggunakan properti pendukung di pengambil:
public string AccountTypeDescription
{
get {
//return AccountTypeDescription; // This would cause infinite recursion.
return _accountTypeDescription; // This fixed the StackOverflowException
}
// setter omitted for clarity (it is in the examples above)
}
Pertanyaanku adalah:
Mengapa pelacakan tumpukan StackOverflowException mengarahkan saya ke SettleDueDate.set() padahal bug sebenarnya ada di dalam AccountTypeDescription.get()?
Catatan: Saya baru mengenal C# dan berasal dari latar belakang LAMP. Saya telah menyederhanakan kodenya sedikit tetapi saya rasa saya tidak menghapus sesuatu yang penting.
_settleDueDateDictionary
(kode), mustahil untuk membantu. - person Erik Philips   schedule 07.12.2012StackOverflowException
- person jenson-button-event   schedule 07.12.2012DateTime
? - person Servy   schedule 07.12.2012SettleDueDate = value;
di suatu tempat di setter (bukan_settleDueDate = value;
), atau sesuatu seperti itu. - person rsbarro   schedule 07.12.2012_settleDueDateDictionary
pengambil dan penyetelSettleDueDate
serta variabel pendukung_settleDueDate
pribadi. Satu-satunya hal yang saya ubah adalah bagaimanaanIntParameterHere
diteruskan ke penyetel. Menurutku bukan itu masalahnya? Apa lagi yang bisa saya berikan?ClassName
jika tidak, hanya berisi pengambil/penyetel lain dan beberapa anggota data lainnya. - person pb149   schedule 07.12.2012DateTime
di seluruh aplikasi Anda dan kemudian mengonversinya menjadi string sebelum Anda menyimpannya dalam file XML, daripada melakukan operasi pada file tersebut di seluruh aplikasi Anda sebagai string. - person Servy   schedule 07.12.2012SettleDueDate
? Apakah mungkin Anda meneruskan nilaiAccountTypeDescription
ke dalamnya dan/atau menggunakannya sebagai kunci kamus? - person Bobson   schedule 10.12.2012STPP.SettleDueDate = Convert.To
...) adalah bagian yang menyetelSettleDueDate
. Terima kasih. - person pb149   schedule 10.12.2012