Как работает этот код? Здесь имя класса используется как тип данных в своей собственной реализации - PullRequest
1 голос
/ 24 апреля 2020
public class Node
{
    public int Value { get; set; }
    public Node Next { get; set; }
}

Я полный новичок в программировании. Я решил выучить C# как свой первый язык программирования. Я сталкивался с этим кодом.

Как 'Узел' определяется как тип данных для Next? Это меня сильно смущает.

Ответы [ 4 ]

1 голос
/ 24 апреля 2020

Как и другие ответы, этот класс представляет узел для связанного списка. В этом случае Node может указывать на другой экземпляр узла.

Node 
{
   int Value = 1;
   Node Next =============>  Node {
}                                   int Value = 2;
                                    Node Next ===========> Node {
                                  }                                int Value = 3;
                                                                   Node Next =======> null
                                                                 }

Обычно вы не встречаете классы, имеющие ссылки на себя, такие как Node.

1 голос
/ 24 апреля 2020

Это хороший вопрос, когда вы узнаете о C#. Ключ в том, что в C# есть два типа типов: типы «значения» и «ссылочные» типы. См. этот вопрос и ответы на него для более подробной информации .

Поскольку Node объявлен как class, это означает, что это ссылочный тип. Если вы создадите переменную со ссылочным типом, то эта переменная не будет содержать данные напрямую; вместо этого он содержит ссылку , которая может указывать на данные. По умолчанию ссылки имеют специальное значение null, что означает, что они ни на что не указывают. Когда вы присваиваете переменную, например, myNode.Next = someOtherNode, вы не копируете всю совокупность someOtherNode в свойство Next; вы просто копируете ссылку на someOtherNode в свойство.

Таким образом, если сам класс Node имеет свойство Node, объект Node фактически не содержит другого объекта Node. Первый объект содержит ссылку на второй объект. Это позволяет одному узлу указывать на другой узел, который затем может указывать на другой узел и т. Д. Совокупность узлов, организованных таким образом, называется связанным списком ; в данном случае это связанный список int (32-разрядных целых) значений.

Если Node был типом значения (объявленным как struct вместо class), тогда действительно будет проблема. Переменные типа значения содержат данные напрямую, поэтому вы не можете иметь экземпляр типа значения, который содержит другой экземпляр того же типа значения.

0 голосов
/ 24 апреля 2020

Это похоже на класс, определяющий узел в односвязном списке, в котором хранятся целочисленные значения. Помните, что класс - это просто определение формы объекта. Это может работать так:

var node1 = new Node {Value = 1}; node1.Node = new Node {Value = 2};

0 голосов
/ 24 апреля 2020

Это называется связанным списком, примером рекурсивной структуры данных. Это можно легко создать в C#, поскольку рекурсию можно завершить, указав последнему узлу в списке нулевое значение для свойства Next.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...