Почему "новое" ключевое слово необходимо в 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#, чтобы быть очень явным, когда есть вероятность неоднозначности (то есть: это конструктор типа или метод?).