在哪些情况下您会使用 new 关键字初始化值类型?
In which scenarios would you initialize a value type with a new keyword?
我的问题是关于使用 new
作为值类型(int
、bool
、...)
int i = new int();
在这种情况下 i
初始化为零值。
我读到将 new
与值类型一起使用并不是一件好事,但是,它不会动态分配内存(仅在堆栈上)。
那么问题来了,为什么C#编译器厂商让我们这样做,在什么情况下这个方法派上用场呢?
值类型也是对象。这是对相应值类型的默认构造函数的调用。这是关于它的 MSDN 注释。
The new operator is also used to invoke the default constructor for value types. For example:
int i = new int();
In the preceding statement, i is initialized to 0, which is the default value for the type int. The statement has the same effect as the following:
int i = 0;
和...
Value-type objects such as structs are created on the stack, while reference-type objects such as classes are created on the heap. Both types of objects are destroyed automatically, but objects based on value types are destroyed when they go out of scope, whereas objects based on reference types are destroyed at an unspecified time after the last reference to them is removed.
更多here
将 new 与原始类型(如 int)一起使用没有任何意义 'bad'。因为它们都派生自对象,所以它们有一个默认的无参数构造函数,当您执行 int i = new int() 时会调用该构造函数。像这样初始化一个 int 会为其分配默认值 0,这与编写 int i = 0;
相同
我认为除了 C# 的开发人员外,没有人能回答他们为什么要离开这个结构,但如果我是你,我不会太担心 int i = new int() 并且会保持良好状态old int i = 0(或您喜欢的任何值)。
更新:
J Richter 写了一本关于 CLR 的好书,叫做 'CLR via C#'。它涵盖了很多像这样的问题。
I have read that it's not a good thing to use new with the value types and does not, however, dynamically allocate memory(just on stack). So the questions is why the C# Compiler makers have let us to do so, in which situation this method comes handy?
至少有一个原因:
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()
或
DateTime dt = new DateTime();
或
DateTime dt = new DateTime(2015, 02, 28);
或(由 Henk Holterman 撰写)
DateTime dt = default(DateTime);
(注意你甚至可以写成 int x = default(int)
:-) )
我的问题是关于使用 new
作为值类型(int
、bool
、...)
int i = new int();
在这种情况下 i
初始化为零值。
我读到将 new
与值类型一起使用并不是一件好事,但是,它不会动态分配内存(仅在堆栈上)。
那么问题来了,为什么C#编译器厂商让我们这样做,在什么情况下这个方法派上用场呢?
值类型也是对象。这是对相应值类型的默认构造函数的调用。这是关于它的 MSDN 注释。
The new operator is also used to invoke the default constructor for value types. For example: int i = new int(); In the preceding statement, i is initialized to 0, which is the default value for the type int. The statement has the same effect as the following: int i = 0;
和...
Value-type objects such as structs are created on the stack, while reference-type objects such as classes are created on the heap. Both types of objects are destroyed automatically, but objects based on value types are destroyed when they go out of scope, whereas objects based on reference types are destroyed at an unspecified time after the last reference to them is removed.
更多here
将 new 与原始类型(如 int)一起使用没有任何意义 'bad'。因为它们都派生自对象,所以它们有一个默认的无参数构造函数,当您执行 int i = new int() 时会调用该构造函数。像这样初始化一个 int 会为其分配默认值 0,这与编写 int i = 0;
相同我认为除了 C# 的开发人员外,没有人能回答他们为什么要离开这个结构,但如果我是你,我不会太担心 int i = new int() 并且会保持良好状态old int i = 0(或您喜欢的任何值)。
更新:
J Richter 写了一本关于 CLR 的好书,叫做 'CLR via C#'。它涵盖了很多像这样的问题。
I have read that it's not a good thing to use new with the value types and does not, however, dynamically allocate memory(just on stack). So the questions is why the C# Compiler makers have let us to do so, in which situation this method comes handy?
至少有一个原因:
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()
或
DateTime dt = new DateTime();
或
DateTime dt = new DateTime(2015, 02, 28);
或(由 Henk Holterman 撰写)
DateTime dt = default(DateTime);
(注意你甚至可以写成 int x = default(int)
:-) )