ОБНОВЛЕНИЕ: я исправил проблему, с которой столкнулся, но я не знаю, почему эта ошибка создала трассировку стека. Трассировка стека привела меня в совершенно неправильном направлении. Если кто-нибудь может объяснить, что здесь происходит, я был бы признателен (и отметит ваш ответ как принятый). Обратите внимание, что мой оригинальный пост был удален.
У меня был следующий класс. Нерелевантные части были удалены:
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;
}
}
}
У меня также был этот класс, который взял экземпляр класса выше и создал строку XML, используя значения из экземпляра:
class SecondClass
{
private ClassName classnameInstance;
public SecondClass(ClassName instance)
{
classnameInstance = instance;
}
public string PrepareRequest(XMLWriter writer)
{
writer.WriteElementString("accounttypedescription", classnameInstance.AccountTypeDescription);
}
}
Вот клиентский код, сгенерировавший трассировку стека:
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);
}
Наконец, вот трассировка стека:
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
Эта трассировка стека привела меня к мысли, что я неправильно реализовал геттер/сеттер для STPP.SettleDueDate. Я проверил их, и вспомогательная переменная и т. д. были правильными (я понимаю, обычные причины циклов в геттерах/сеттерах). Дальнейшая отладка показала мне, что трассировка стека фактически была сгенерирована, когда была вызвана эта строка PrepareRequest()
:
writer.WriteElementString("accounttypedescription", STPPData.AccountTypeDescription);
Я обнаружил, что неправильно реализовал геттер для STPPData.AccountTypeDescription, потому что создал вспомогательное свойство, которое использовал в установщике, но НЕ использовал резервное свойство в геттере:
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)
}
Мой вопрос:
Почему трассировка стека StackOverflowException указывает мне на SettleDueDate.set(), когда ошибка на самом деле была внутри AccountTypeDescription.get()?
Примечание. Я новичок в C# и работаю с LAMP. Я немного упростил код, но не думаю, что удалил что-то важное.
_settleDueDateDictionary
(код), помочь практически невозможно. - person Erik Philips   schedule 07.12.2012StackOverflowException
- person jenson-button-event   schedule 07.12.2012DateTime
? - person Servy   schedule 07.12.2012SettleDueDate = value;
(вместо_settleDueDate = value;
) или что-то в этом роде. - person rsbarro   schedule 07.12.2012_settleDueDateDictionary
геттера и сеттераSettleDueDate
, а также частной_settleDueDate
резервной переменной. Единственное, что я изменил, это то, какanIntParameterHere
передается сеттеру. Я не думаю, что это может быть проблемой? Что еще я мог предоставить?ClassName
в противном случае просто содержит другие геттеры/сеттеры и несколько других членов данных. - person pb149   schedule 07.12.2012DateTime
во всем приложении, а затем преобразовывать его в строку непосредственно перед сохранением в XML-файле, а не выполнять операции с ним во всем приложении как строку. - person Servy   schedule 07.12.2012SettleDueDate
? Возможно ли, что вы передавали в него значениеAccountTypeDescription
и/или использовали его в качестве ключа словаря? - person Bobson   schedule 10.12.2012STPP.SettleDueDate = Convert.To
...) — это та часть, которая устанавливаетSettleDueDate
. Спасибо. - person pb149   schedule 10.12.2012