新运算符在此代码中是什么意思

时间:2020-06-17 14:11:55

标签: c#

我是C#学生,当我学习代码阅读时,我对此代码有疑问

public class Solution {
    public int solution(int[] priorities, int location)
    {
        int answer = 0;
        Queue<KeyValuePair<int, int>> que = new Queue<KeyValuePair<int, int>>();
        for(int i = 0; i < priorities.Length; i++)
        {
            que.Enqueue(new KeyValuePair<int, int>(i, priorities[i]));
        }
    }

据我所知,new运算符用于在引用类型的对象中创建实例,如下所示:

Queue<KeyValuePair<int, int>> que = new Queue<KeyValuePair<int, int>>();

(因此que是在堆栈中制成的,而new是在堆中分配内存的。

但是:

que.Enqueue(new KeyValuePair<int, int>(i, priorities[i]))

在此代码中,new的行为没有变量。

(请注意,我发现KeyValuePair <>是结构类型,我想知道为什么值类型使用“新” ...我们不像值int a= new 3中使用“新”)

我想知道会发生什么

plz教我

谢谢

1 个答案:

答案 0 :(得分:6)

表达式new MyType() 创建一个MyType的实例-分配内存。

在编写MyType m = ...时,您只是将变量分配。这不会分配任何东西。

因此,这两个表达式是完全独立的。您可以分配(直接)之前没有创建的内容:

MyType m = new MyType();
MyType m2 = m; // just re-reference the instance created above, no memory allocation here

,您还可以创建一个对象并且不对其执行任何操作(尽管通常这是一个坏主意):

new MyType();

对于que.Enqueue(new KeyValuePair<int, int>(i, priorities[i])),您创建一个KeyValuePair,但将其分配给方法item-参数。

您还可以将该对象存储到新变量中,并将其传递给方法:

var kv = new KeyValuePair<int, int>(i, priorities[i]);
que.Enque(kv);