我读过,将 new 与值类型一起使用并不是一件好事,但是,它不会动态分配内存(仅在堆栈上)。那么问题是为什么 C# 编译器制造商允许我们这样做,在什么情况下这种方法会派上用场?
至少有一个原因:
void MyFunc<T>() where T : new()
{
T someValue = new T();
// probably other code here :-)
}
调用它
MyFunc<int>();
对于泛型,您必须能够使用new()
。如果某些值类型没有new()
那么就不可能编写这样的代码。
请注意,对于int
, long
,...以及几乎所有其他原始值类型(除了bool
,并且对于bool
有new bool() == false
)您可以使用数字文字来初始化它们(0, 1, ...),但对于其他值类型则不能。您必须使用静态值(然后以其他方式构建)或 new 运算符。例如DateTime
:-)
你不能写:
DateTime dt = 0;
你必须写:
DateTime dt = DateTime.MinValue; // Where DateTime.MinValue is probably defined as new DateTime()
or
DateTime dt = new DateTime();
or
DateTime dt = new DateTime(2015, 02, 28);
或(由亨克·霍尔特曼撰写)
DateTime dt = default(DateTime);
(请注意,您甚至可以写int x = default(int)
:-) )