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

时间:2015-02-28 19:35:14

标签: c# initialization value-type

我的问题是关于将new用于值类型(intbool,...)

int i = new int();

在这种情况下,i初始化为零值。

我已经读过将new与值类型一起使用并不是一件好事,但是不会动态分配内存(仅在堆栈上)。 所以问题是C#编译器制造商让我们这样做的原因,在哪种情况下这种方法会派上用场?

3 个答案:

答案 0 :(得分:3)

  

我已经读过,将new与值类型一起使用并不是一件好事,但是不会动态分配内存(仅在堆栈上)。所以问题是C#编译器制造商让我们这样做的原因,在哪种情况下这种方法很方便?

至少有一个原因:

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

调用它
MyFunc<int>();

使用泛型,您必须能够使用new()。如果某些值类型没有new()那么就不可能编写类似的代码。

请注意,intlong,...以及几乎所有其他原始值类型(bool除外)和bool都有{{1}您可以使用数字文字来初始化它们(0,1,...),但对于其他值类型,您不能这样做。您必须使用静态值(然后以其他方式构建)或新运算符。例如new bool() == false: - )

你不能写:

DateTime

你必须写:

DateTime dt = 0;

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

DateTime dt = new DateTime();

或(由Henk Holterman撰写)

DateTime dt = new DateTime(2015, 02, 28);

(请注意,您甚至可以写DateTime dt = default(DateTime); :-))

答案 1 :(得分:0)

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

  

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

和......

  

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

更多here

答案 2 :(得分:0)

使用new和原始类型(如int)没有任何“坏”。因为它们都是从对象派生的,所以它们有一个默认的无参数构造函数,当你执行int i = new int()时会调用它。像这样初始化一个int赋予它一个默认值0,这与写入int i = 0相同;

我认为除了C#的开发人员之外没有人可以回答他们为什么离开这个构造,但如果我是你,我不会过分担心int i = new int()并且会保持良好的旧int i = 0(或者你喜欢的任何值)。

UPD:

J Richter写了一本关于CLR的好书叫做'CLR via C#'。它涵盖了很多像这样的问题。