Почему "новое" ключевое слово необходимо в C#

Предположим, у меня есть функция foo, которая принимает векторный класс в качестве входных данных:

void Foo( Vector3 vector );

Если я хочу вызвать эту функцию:

Foo( new Vector3(1, 2, 3) );

Почему новое ключевое слово необходимо (в C#) вообще?

В других языках, например: C++, в этом случае нет необходимости использовать new. Это просто кажется излишним

edit 1: @ spender, следующее совершенно верно C++

Foo ( Vector3(1, 2, 3) );

В стеке будет создан объект Vector3, новый /calloc/malloc не требуется.

1 ответ

Ключевое слово было сочтено целесообразным разработчиками языка. В C# распространено, что язык заставляет вас быть в курсе происходящего, и предоставляет либо ошибки, либо предупреждения во многих сценариях, где он мог бы неявно добавить функции или "заполнить" данные для вас.

C# всегда требует от вас инициализации переменных перед использованием. В этом случае, принуждая new Ключевое слово делает для разработчика очевидным, что новый экземпляр (если Vector3 является классом) или полностью сконструированный тип (если Vector3 является типом значения) будет передан в ваш метод, в отличие от результата вызова метода.,

C++ нет необходимости использовать новый

Обратите внимание, что в C++ new здесь не является обязательным, по крайней мере, без изменения определения вашей функции. С помощью new будет означать Foo() потребуется другой синтаксис.

Звонок без нового (Foo(Vector3(1,2,3));) предполагает, что Foo определяется как void Foo(Vector3 vector), Если бы вы были использовать new Vector3тогда Foo будет определен void Foo(Vector3* vector), поскольку новый вернет указатель на тип.

Это связано с тем, что C++ допускает несколько форм размещения объектов - вы можете размещать в стеке (без нового) или размещать в куче (используя new). C# не имеет этой разницы - все ссылочные типы всегда выделяются в долговременном хранилище, а типы значений размещаются в местоположении в зависимости от их контекста и использования. Разработчик не имеет такого же уровня контроля в C#, как в C++, с точки зрения использования и размещения объектов.

В конце концов, каждый язык (с концепцией объектов) имеет собственный синтаксис и правила для инициализации и использования объектов. Каждый язык уникален, отчасти поэтому существует так много разных языков. В целом, большинство языков построены вокруг набора руководящих принципов и подходов, а также требований к использованию. new подходит к подходу C#, чтобы быть очень явным, когда есть вероятность неоднозначности (то есть: это конструктор типа или метод?).

Другие вопросы по тегам