Что означает новый оператор в этом коде - PullRequest
0 голосов
/ 17 июня 2020

Я новичок 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 выделяет память в куче <- я научился так) </p>

но:

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

В этом коде new действует без переменных.

(Ps. Я обнаружил, что KeyValuePair <> - это тип структуры. Интересно, почему тип значения использует "новый" ... мы не используйте "новый" в типе значения, например int a= new 3)

Я хочу знать, что происходит

, пожалуйста, научите меня

спасибо

1 Ответ

6 голосов
/ 17 июня 2020

Выражение 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...