2016-12-05 33 views
1

我有一个代码导致堆栈溢出异常,并想知道这是一个常见问题或某种错误的简单示例。堆栈溢出错误可空数字类型c#

我正在使用控制台应用程序来生成一些数据。它将大约20000个对象添加到集合中。一些字段是可空的。如果我让他们布尔?那么它的工作原理,但如果我将其中的几个(如我在示例代码中)更改为十进制?那么它会抛出异常。

它也只做到这一点,当我身体增加20000添加(...行。如果我在一个循环做到这一点,然后它工作正常(这是在本例中为好)。

道歉长度的代码的例子。任何帮助,将不胜感激。

using System.Collections.Generic; 
    using System; 

    namespace StackOverflow 
    { 
     class Program 
     { 
      static void Main(string[] args) 
      { 
       Console.WriteLine($"{new UpdateCommands().Count} commands"); 
       Console.WriteLine($"{new CreateCommands().Count} commands"); 
       Console.ReadKey(); 
      } 
     } 
    } 

    public class CreateCommand 
    { 
     public CreateCommand(string code, string name, string label, string field1, string field2, string field3, 
      bool? field4, bool? field5, bool? field6, bool? field7, decimal? field8, decimal? field9, decimal? field10, decimal? field11) 
     { 
     } 
    } 

    public class UpdateCommands : List<CreateCommand> 
    { 
     public UpdateCommands() 
     { 
      for (int i = 0; i < 22000; i++) 
      { 
       Add(new CreateCommand("code", "name", "label", "", null, null, null, null, null, null, null, null, null, null)); 
      } 
     } 
    } 

    public class CreateCommands : List<CreateCommand> 
    { 
     public CreateCommands() 
     { 

      Add(new CreateCommand("code", "name", "label", "", null, null, null, null, null, null, null, null, null, null)); 

you need to copy the line above 22000 times 
     } 
    } 
+1

这不会编译,因为没有'CreateCommands'类。如果你的意思是'新的CreateCommand',它没有无参数构造函数,也没有定义'Count'方法。 – juharr

+0

我认为问题的目的是为什么你有很多行时得到stackoverflow。这不是一个愚蠢的问题。因为OP已经知道如何使用循环,这是为了学习的目的。 –

+0

我刚刚测试过这个,'Main'方法的第一行运行良好。第二个不能编译,所以你需要使用更多的信息来弄清楚发生了什么。 – juharr

回答

0

实质上,堆栈的大小是有限的,所以你也可以在不存在无限循环的运行成StackOverflowException

以下IL代码是为每个生成的-call在调试模式下:

.maxstack 15 
.locals init (
    [0] valuetype [mscorlib]System.Nullable`1<bool>, 
    [1] valuetype [mscorlib]System.Nullable`1<valuetype [mscorlib]System.Decimal> 
) 
IL_0357: nop 
IL_0358: ldarg.0 
IL_0359: ldstr "code" 
IL_035e: ldstr "name" 
IL_0363: ldstr "label" 
IL_0368: ldstr "" 
IL_036d: ldnull 
IL_036e: ldnull 
IL_036f: ldloca.s 0 
IL_0371: initobj valuetype [mscorlib]System.Nullable`1<bool> 
IL_0377: ldloc.0 
IL_0378: ldloca.s 0 
IL_037a: initobj valuetype [mscorlib]System.Nullable`1<bool> 
IL_0380: ldloc.0 
IL_0381: ldloca.s 0 
IL_0383: initobj valuetype [mscorlib]System.Nullable`1<bool> 
IL_0389: ldloc.0 
IL_038a: ldloca.s 0 
IL_038c: initobj valuetype [mscorlib]System.Nullable`1<bool> 
IL_0392: ldloc.0 
IL_0393: ldloca.s 1 
IL_0395: initobj valuetype [mscorlib]System.Nullable`1<valuetype [mscorlib]System.Decimal> 
IL_039b: ldloc.1 
IL_039c: ldloca.s 1 
IL_039e: initobj valuetype [mscorlib]System.Nullable`1<valuetype [mscorlib]System.Decimal> 
IL_03a4: ldloc.1 
IL_03a5: ldloca.s 1 
IL_03a7: initobj valuetype [mscorlib]System.Nullable`1<valuetype [mscorlib]System.Decimal> 
IL_03ad: ldloc.1 
IL_03ae: ldloca.s 1 
IL_03b0: initobj valuetype [mscorlib]System.Nullable`1<valuetype [mscorlib]System.Decimal> 
IL_03b6: ldloc.1 
IL_03b7: newobj instance void CreateCommand::.ctor(string, string, string, string, string, string, valuetype [mscorlib]System.Nullable`1<bool>, valuetype [mscorlib]System.Nullable`1<bool>, valuetype [mscorlib]System.Nullable`1<bool>, valuetype [mscorlib]System.Nullable`1<bool>, valuetype [mscorlib]System.Nullable`1<valuetype [mscorlib]System.Decimal>, valuetype [mscorlib]System.Nullable`1<valuetype [mscorlib]System.Decimal>, valuetype [mscorlib]System.Nullable`1<valuetype [mscorlib]System.Decimal>, valuetype [mscorlib]System.Nullable`1<valuetype [mscorlib]System.Decimal>) 
IL_03bc: call instance void class [mscorlib]System.Collections.Generic.List`1<class CreateCommand>::Add(!0) 

(行号每次迭代当然不同,并且所述第一两个声明不重复)

在这一段代码,堆栈应保持在相等的尺寸, maxstack计算为15.因此,这里的StackOverflow异常是一个错误,因为JIT没有正确摆脱栈条目。你试过什么JITTER?

+0

只是标准,还尝试过V4,4.5和4.6的框架。 – Dave