微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么将原始结构添加到 List 不需要 new 关键字而将非原始结构添加到 List 需要 new 关键字? - C#

如何解决为什么将原始结构添加到 List 不需要 new 关键字而将非原始结构添加到 List 需要 new 关键字? - C#

将原始 struct(例如 int添加List

int i=10;
List<int> list=new List<int>();
list.Add(i);

对比: 将非原始 struct(例如 keyvaluePair<int,int>添加到列表:

List<keyvaluePair<int,int>> list = new List<keyvaluePair<int,int>>();
list.Add(new keyvaluePair<int,int>(10,20));

int struct 添加list 时,我们不需要使用 new 关键字。但是在将 keyvaluePair struct 添加到列表时,我们需要使用 new 关键字。

我的意思是,以下陈述无效:

list.Add(new int(10)); //invalid statement

虽然 intkeyvaluePair 都是结构体,但它们的行为有所不同 - 使用前不需要实例化(就用户而言)。另一个需要在使用前实例化。

为什么我们不能改为执行以下操作:

list.Add(keyvaluePair<int,20)) //omit the new keyword,as we were doing with an int

来自 C/C++ 背景,new 关键字在 C# 中究竟有什么作用? 它是否只是实例化底层数据类型(我们不确定实例化的数据类型是在堆栈上还是在堆上)。或者,我们确定使用 new 关键字会在堆上分配内存(就像在 C++ 中那样)?

解决方法

new 关键字在 C# 中有什么作用?

已全部列出 here。与这个问题最相关的是“构造函数调用”。结构和类都有构造函数,构造函数创建结构和类的实例。

当你这样做时:

new KeyValuePair<int,int>(10,20)

您正在呼叫 this constructor

intInt32 结构的别名,没有接受 int 类型参数的构造函数。这就是你做不到的原因:

new int(10)

请注意,调用构造函数并不是创建结构实例的唯一方法。您还可以执行以下操作:

var defaultKVP = default(KeyValuePair<int,int>); // gets the default value of the type KeyValuePair<int,int>
// defaultKVP is an instance of KeyValuePair<int,int>! It's not null! Structs can't be null :)

结构体的 default value 是通过将其所有值类型字段设置为其默认值,并将引用类型字段设置为 null 来定义的。

10 这样的整数文字是结构体 Int32 的一个实例的原因,是编译器的魔法。规范是这么说的,所以它是这样实现的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?