Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将项目添加到列表中<;T>;/防御性编程_C#_Defensive Programming - Fatal编程技术网

C# 将项目添加到列表中<;T>;/防御性编程

C# 将项目添加到列表中<;T>;/防御性编程,c#,defensive-programming,C#,Defensive Programming,当添加到C#列表时,显式检查/处理未达到2^31-1(?)最大条目数是疯狂,是真是假 (假设这是一个平均列表大小小于100的应用程序。)似乎太多了。根据列表中对象的大小,是否先达到机器的内存限制?(我假设此检查是由List类的用户执行的,而不是实现中的任何检查?) 不过,同事们正在提前考虑,这或许是一种安慰?(讽刺!)看起来是这样的,我可能不会包括支票,但我对此感到矛盾。程序员曾经认为2位数字足以表示日期字段中的年份,理由是这对于他们的代码的预期寿命来说是合适的,但是我们发现这个假设是不正确的

当添加到C#列表时,显式检查/处理未达到2^31-1(?)最大条目数是疯狂,是真是假


(假设这是一个平均列表大小小于100的应用程序。)

似乎太多了。根据列表中对象的大小,是否先达到机器的内存限制?(我假设此检查是由List类的用户执行的,而不是实现中的任何检查?)


不过,同事们正在提前考虑,这或许是一种安慰?(讽刺!)

看起来是这样的,我可能不会包括支票,但我对此感到矛盾。程序员曾经认为2位数字足以表示日期字段中的年份,理由是这对于他们的代码的预期寿命来说是合适的,但是我们发现这个假设是不正确的


看看风险,看看努力,然后做出判断(或者称为有根据的猜测!)。我不会说在这个问题上有任何硬性规定。

正如上面的答案所示,我怀疑会有更多的事情出错,而不是担心。但是,如果你有时间和意愿,你可以打磨代码,直到它发光

正确


(你问的是真是假……)

1。内存限制

不带任何属性的System.Object的大小是8字节(2x32位指针),或者在64位系统中是16字节[编辑:实际上,我刚刚签入了WinDbg,x86上的大小是12字节(32位)

因此,在32位系统中,您需要24Gb的ram(在32位系统中无法使用)

2。节目设计

我坚信这样大的列表不应该保存在内存中,而应该保存在其他存储介质中。但在这种情况下,您将始终可以选择创建一个包装列表的缓存的类,该类将处理引擎盖下的实际存储。因此,在添加之前测试大小是进行测试的错误位置,如果有一天您觉得有必要,您的列表实现应该自己进行测试

3。为了安全起见

为什么不在每个方法中添加一个重新进入计数器以防止堆栈溢出?:)

所以,是的,测试它是疯狂的。:)

刚刚尝试了以下代码:

List<int> list = new List<int>();
while (true) list.Add(1);
List List=新列表();
while(true)列表。添加(1);

我有一个System.OutOfMemoryException。那么,您将如何检查/处理此问题呢?

如果您继续向列表中添加项目,那么在达到该限制之前,您的内存就会耗尽。我所说的“长”其实是指“比你想象的要快得多”

请参见关于大型对象堆(LOB)的。一旦你点击了大约21500个元素(64位系统的一半)(假设你正在存储对象引用),你的列表将开始成为一个大对象。由于LOB的压缩方式与正常的.NET堆不同,因此最终会将其严重分割,以致无法分配足够大的连续内存区域


所以你根本不需要检查这个极限,它不是一个真正的极限。

是的,这就是疯狂

考虑当您开始达到这些数字时,代码的其余部分会发生什么情况。如果列表中有数百万项,应用程序是否可用


如果应用程序有可能达到如此大的数据量,也许您应该采取措施防止列表变得如此之大。也许您甚至不应该一次将所有数据保存在内存中。我真的无法想象任何代码都能实际使用这么多数据的场景。

你会发现OutOfMemoryException。OOM通常可以在一分钟或更长时间内处理并重试操作。例如,两个独立的线程需要大量内存,但只有1个线程可以获得。稍后再试第二个。如果应用程序在内存中执行PDF或图像处理,有时可能会发生这种情况。