C# 为什么DateTime的AddMonths函数采用Int32参数而不是Int16

C# 为什么DateTime的AddMonths函数采用Int32参数而不是Int16,c#,.net,datetime,C#,.net,Datetime,我对这件事很好奇 Int32 Int16 如果我们可以在AddMonths函数中指定Int16作为参数,并且月份的值不能超过12,那么为什么.NET Framework将月份用作Int32而不是Int16 如果在将月份声明为Int16时存在任何特定于区域性的问题 我在这里想,如果这个月是Int16,那么它将在某些地方节省一些长度。。我认为内存分配 使现代化 DateTime.Now.Month属性的建议是什么?不能是Int16而不是Int32吗 都是一样的吗?首先,可能会超过12个月。没有什么能

我对这件事很好奇

Int32

Int16

如果我们可以在AddMonths函数中指定Int16作为参数,并且月份的值不能超过12,那么为什么.NET Framework将月份用作Int32而不是Int16

如果在将月份声明为Int16时存在任何特定于区域性的问题

我在这里想,如果这个月是Int16,那么它将在某些地方节省一些长度。。我认为内存分配

使现代化 DateTime.Now.Month属性的建议是什么?不能是Int16而不是Int32吗


都是一样的吗?

首先,可能会超过12个月。没有什么能阻止你计算日期加435345个月

至于Int32选项:Int32是32位系统的本机整数数据类型,因此它是最有效的数据类型

如果我们可以在AddMonths函数中指定Int16作为参数,并且月份的值不能超过12,那么为什么.NET Framework将月份用作Int32而不是Int16


为什么你不能在今天的基础上再加上13个月,最后是2012年6月25日呢?

你的假设是错误的:

此外,该月的价值永远无法计算 超过12


即使您是正确的,我也不认为使用16位整数而不是32位整数会给您带来多少好处:DateTime对象的大小可能根本不会改变。

您可以使用AddMonths函数为给定日期添加12个月以上的时间

但实际限制如下:

月份值必须介于+/-120000之间


@所有这些问题都可能会突出一个主题,你可以在一个日期上加上18个月,所以12个月的上限是没有意义的,如果是这样的话,字节将比Int16@all好的,我同意@philippe leybaert和jason的概念,但DateTime.Now.Month属性的建议是什么?如果我们进行微优化,它不能是Int16而不是Int32吗,当字节可用时,我们为什么要停在Int16处?@damien不相信真理这个答案不是时不变的+1.为什么在Int16中浪费16位,在字节中浪费24位?此外,假设一个月不能添加超过12个是不正确的。有效的月数可以限制为12个月,如果是以一个月为基础的,那么你可以在一个日期上加上大量的月数来计算新的日期。@Mike:我不明白你说的浪费是什么意思。内存究竟在哪里被浪费?这个争论几乎肯定会被注册,而且在现代硬件上,这个寄存器至少有32位宽。您真的想生成额外的代码来确保32位寄存器中的数字永远不会大于16位整数吗?为了确保前16位始终为零,您愿意生成多少额外代码?@Eric,实际上,我认为我们非常同意。尽管我很乐意承认你在CLR和编译器内部的知识非常丰富,但我只是一个纸上谈兵的理论家,我对这些东西如何工作的知识充其量也只是微不足道。我的观点是,在任何情况下,您都会使用32位,而通过分配较小的数据类型来节省内存在很大程度上是毫无意义的,特别是因为关于方法契约的假设是不正确的。@Mike:啊,是的,那么我们是一致的。我误解了你论点的主旨。我的错!
int addmonths_int = 10;
DateTime.Now.AddMonths(addmonths_int);
short addmonths_short = 10;
DateTime.Now.AddMonths(addmonths_short);