Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.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# 根据设计,为什么不是';int不存在单个参数吗?_C# - Fatal编程技术网

C# 根据设计,为什么不是';int不存在单个参数吗?

C# 根据设计,为什么不是';int不存在单个参数吗?,c#,C#,根据设计,为什么没有一个用于int的单一参数ctor,以便x可以设置为12,而不必先设置为0?这是不必要的-我更喜欢: using System; namespace FirstApplication { class Program { static void Main(params string[] args) { int x = new int(); x = 12; //

根据设计,为什么没有一个用于
int
的单一参数ctor,以便
x
可以设置为12,而不必先设置为0?

这是不必要的-我更喜欢:

using System;

namespace FirstApplication
{
    class Program
    {
        static void Main(params string[] args)
        {
            int x = new int();
            x = 12;
            //int y = new int(12);
            Console.WriteLine(x);
        }
    }
}


提供无参数构造函数是因为
int
是一个
struct
,我从未见过任何实际使用它的生产代码。

原因在于CLR本身。CLR不会将
Int32
视为任何普通结构。它有一个特殊类型,用于存储
int
,它不是CLR对象。这意味着它不需要构造函数,就像C中的
int
没有构造函数一样

此外,结构默认构造函数的CLR处理是将所有字段设置为其默认值。对于int,这是0
new int()
似乎是一个特例,只是作为0的“别名”,完全消除了任何构造函数

另外,这显然更好

int x = new int(12);
它不是用户要求的

结构可以声明具有参数的实例构造函数

不一定非得非得非得非得非得非得非得非得非得非得非得非得非得非得非得非得非得非得非得非得非得非得非得非得非得非得非得非得非得非得非得非得非得非得非得非得;因此,提供接受参数的构造函数是完全可选的。设计师们选择了不这样做,所以给了他们更多的权力;-)

还有什么其他原因吗?

简化设计?

让我们设想一下,框架设计师决定提供一个构造函数:

int x = 12;
构造函数的复杂性现在增加了。为了避免溢出错误,需要检查所提供值的边界

因此,简化也是反对提供构造函数的理由

该规范还定义了默认值“”。对于int。正如@KendallFrey所提到的,可能存在对int实例化的优化,但是,它们肯定有一个构造函数,一个隐式的默认构造函数将值初始化为0。IIRC(我将看看是否可以在以后挖掘出来),简单类型实际上是由内存管理器实例化的。这里附加的构造函数逻辑也可能使问题复杂化

强制语义?

@rich.okelly提到,int x=12;只是看起来不错;这是因为我们通常理解值类型语义,包括直接赋值。对我来说,引用类型赋值var x=new RefType();总是推断分配和分配有不同的过程发生;新手用户可能期望:

int myInt = new int(99999999999999999999999999999999999);

在某种程度上是等价的

注:


我真的不相信这是一个任何人都能回答的问题,除了在框架中实现它的人。

拥有它有什么意义?@harold:为了完整性。它的存在会影响性能吗?一个整数上的构造函数有什么用途?@crediter-除了是一个可怕的想法之外,不会有可测量的性能影响。我认为我从来没有想过尝试使用一个构造函数来得到一个只为int+1的答案,而这个答案实际上回答了OP的问题。这解释了吗
Int16
Int64
或者这个特殊的CLR处理纯粹是为了
Int32
?@KendallFrey你有任何链接/来源吗?@KendallFrey我不确定这如何适用于C,因为
Int32
结构,其中
int
是一个别名,其成员不是
对象上定义的成员。所以我看不出为什么它不能有构造函数(但有很多原因它不能)。不管MSIL做什么,C#都可以有带参数的构造函数
newint(无论什么)
可能只是
无论什么的糖(输入检查为int)-这毫无意义,但可能。
int myInt = new int(99999999999999999999999999999999999);
int x = new int(12);
XmlDocument x = new XmlDocument();