Произошло необработанное исключение типа «System.StackOverflowException» в .dll

Я разрабатываю приложение Windows на С#. В моем приложении я использовал один статический класс.

Ниже приведен код:

public static class clsNumber
{
     private static object vValue;

     public static object Value
     {
         get
         {
              return Value;
         }
         set
         {
              Value = value;
         }
     }

     public static string HexValue
     {
         get
         {
              try
              {
                   return Microsoft.VisualBasic.Conversion.Hex(vValue);
              }
              catch
              {
                   return Convert.ToString(vValue);
              }
         }
         set
         {
              Value = Microsoft.VisualBasic.Conversion.Val("&H" + value);
         }
     }
}

Из другого класса устанавливается значение "HexValue" вышеупомянутого класса. Ниже приведена строка кода:

iStick = sOutPut.Substring(0, 8);
clsNumber.HexValue = iStick;

При выполнении вышеуказанной строки кода возникает следующая ошибка:

"An unhandled exception of type 'System.StackOverflowException' occurred in <.....>.dll"

Может ли кто-нибудь помочь мне с решением этого? Заранее спасибо.


person user1018213    schedule 05.04.2012    source источник
comment
Получатель свойства Value использует свойство Value. Который использует геттер свойства Value. Который использует геттер свойства Value. Который использует геттер свойства Value. Который использует геттер свойства Value. Который использует геттер свойства Value. Который использует геттер свойства Value. Который использует геттер свойства Value. Который использует геттер свойства Value... Kaboom!!!!   -  person Hans Passant    schedule 05.04.2012


Ответы (3)


Здесь у вас есть непрерывная рекурсия:

public static object Value  
{
     get
     {
          return Value;
     }
     set
     {
           Value = value;      
     }
 }

Строка return Value в геттере рекурсивно вызывает геттер, что приводит к переполнению стека. И аналогично для сеттера.

Я думаю, вы имели в виду:

public static object Value  
{
     get
     {
          return vValue;
     }
     set
     {
           vValue = value;      
     }
 }

я не вижу, что можно получить от использования явно названного поля здесь, чтобы вернуться к свойству. Я бы удалил vValue и объявил свойство следующим образом:

public static object Value { get; set; }
person David Heffernan    schedule 05.04.2012

2 вещи:

  1. Вы забыли, что создали поле vValue.

  2. Не делайте свойство рекурсивным (за исключением случаев, когда это действительно необходимо и может быть разрешено после нескольких итераций). Здесь вы вызываете свойство Value внутри свойства Value.

person Dhananjay    schedule 05.04.2012

public static string HexValue 

в приведенной выше строке используйте StringBuilder вместо строки

person tarakaram gopal    schedule 05.04.2012