C# 在哪些情况下,您会使用新关键字初始化值类型?

C# 在哪些情况下,您会使用新关键字初始化值类型?,c#,initialization,value-type,C#,Initialization,Value Type,我的问题是关于对值类型(int,bool,…)使用new) 在这种情况下,i用值0初始化 我已经读到,将new与值类型一起使用不是一件好事,而且不会动态分配内存(仅在堆栈上)。 所以问题是为什么C#编译器制造商让我们这么做,在什么情况下这种方法很方便 值类型也是对象。这是对相应值类型的默认构造函数的调用。这是MSDN关于它的说明 新运算符还用于调用值类型的默认构造函数。例如: int i=新的int(); 在前面的语句中,i被初始化为0,这是int类型的默认值。该语句具有与以下语句相同的效果:

我的问题是关于对值类型(
int
bool
,…)使用
new

在这种情况下,
i
用值0初始化

我已经读到,将
new
与值类型一起使用不是一件好事,而且不会动态分配内存(仅在堆栈上)。
所以问题是为什么C#编译器制造商让我们这么做,在什么情况下这种方法很方便

值类型也是对象。这是对相应值类型的默认构造函数的调用。这是MSDN关于它的说明

新运算符还用于调用值类型的默认构造函数。例如: int i=新的int(); 在前面的语句中,i被初始化为0,这是int类型的默认值。该语句具有与以下语句相同的效果: int i=0

而且

值类型对象(如结构)在堆栈上创建,而引用类型对象(如类)在堆上创建。这两种类型的对象都会自动销毁,但基于值类型的对象在超出范围时会被销毁,而基于引用类型的对象在删除最后一次引用后的未指定时间被销毁


更多

将new与int等基元类型一起使用并没有什么不好的地方。因为它们都派生自object,所以它们有一个默认的无参数构造函数,在执行int i=new int()时调用。像这样初始化一个int会给它分配一个默认值0,这与写入int i=0相同

我认为除了C#的开发人员之外,没有人能回答他们为什么离开这个构造,但是如果我是你,我就不会太担心int I=new int(),而是会保持原来的int I=0(或者你喜欢的任何值)

UPD:

J·里克特写了一本关于CLR的好书,名为《通过C#实现CLR》。它涵盖了很多像这样的问题

我已经读到,将new和值类型一起使用不是一件好事,而且不会动态分配内存(仅在堆栈上)。所以问题是为什么C#编译器制造商让我们这么做,在什么情况下这种方法很方便

这至少有一个原因:

void MyFunc<T>() where T : new()
{
    T someValue = new T();
    // probably other code here :-)
}
你必须写:

DateTime dt = DateTime.MinValue; // Where DateTime.MinValue is probably defined as new DateTime()

或(由亨克·霍特曼撰写)


(请注意,您甚至可以编写
intx=default(int)
:-)

我编辑了您的答案,并从标记中删除了c-请阅读:即使是MSDN也写下“在堆栈上创建了结构等值类型对象”,这绝对是可怕的。类中的int“存在”在堆中。在问这个问题之前,我读过那篇文章,但我的问题是关于它的含义,比如你能写一个代码,在那里使用new for var type很方便吗?还是解决问题?为了完整起见,您还可以编写
DateTime dt=default(DateTime)@Henkholtman yep。。。在编写一般示例时,我曾考虑过
default
操作符,因为
default(T)
是该操作符的经典用法(对于值类型
new T()==default(T)
,但后来我决定最好使用“non-metere-troppa carne al-fuoco”(不要放太多的肉在火上)
MyFunc<int>();
DateTime dt = 0;
DateTime dt = DateTime.MinValue; // Where DateTime.MinValue is probably defined as new DateTime()
DateTime dt = new DateTime();
DateTime dt = new DateTime(2015, 02, 28);
DateTime dt = default(DateTime);