Ответ 1
Я не могу дать окончательного ответа, так как я не могу читать мысли дизайнеров LinkedList<T>
. Я могу сказать это.
В Java класс LinkedList<E>
реализует интерфейс Queue<E>
, который отражает решение относительно части дизайнеров: "Вы знаете, что? Связанный список можно легко использовать в качестве очереди, поэтому мы могли бы также иметь он реализует этот интерфейс". И способ, которым вы взаимодействуете с очередью, заключается в том, чтобы вытаскивать элементы из конца, а затем, вы знаете, используя их для чего-то (что означает, что для операции Pop
, возвращаемой элементом, вызывается естественным).
В .NET отсутствует интерфейс IQueue<T>
. В принципе, дизайнеры приняли другое решение: "Самая эффективная реализация поведения в очереди, о котором мы знаем, представляет собой простую круглую очередь на основе массивов. Поэтому, если разработчикам нужна очередь, они должны использовать класс Queue<T>
, который точно что".
Если разработчик хочет использовать LinkedList<T>
в качестве очереди (или дека в этом отношении), скорее всего, он выбирает неправильную реализацию для структуры данных, которая им действительно нужна (из точки .NET).
Таким образом, в духе "правильная функция должна делать что-то одно", люди BCL решили сделать LinkedList<T>.RemoveFirst
сделать именно это: удалить первый элемент (аналогично тому, как List<T>.RemoveAt
просто удаляет элемент в указанный индекс и ничего не возвращает).
Я не говорю, что решение правильное или неправильное. Я думаю, что различные интерфейсы стандартного класса связанных списков в Java и .NET просто отражают разные представления о том, что такое связанный список, и как он должен использоваться в двух рамках.