Стоит отметить, что правила .NET отличаются от правил C#.
Есть вещи, которые мы можем сделать в .NET, которых мы не можем сделать на C#, как правило, либо потому, что код не поддается проверке (например, типы возвращаемого типа), либо потому, что они могут ввести некоторую путаницу.
В C# struct
ы не может иметь определенный конструктор без параметров, и вызова new SomeValueType()
работ пути создания заполненных нулей части памяти (поэтому все поля являются 0
для числовых типов, null
для ссылочных типов, и результата этого же правил снова для других типов значений).
В .NET у вас может быть безпараметрированный конструктор для типа значения.
Возможно, это плохая идея. С одной стороны, правила только тогда, когда он вызывается, и только когда память значения заполнена нулем, а также то, что происходит при назначении в разных случаях, не совсем просто (например, new SomeValueType()
будет называть это, но new T()
в общем методе, где T
- SomeValueType
не будет!). Жизнь проще, если результат new SomeValueType()
всегда будет нулевым заполнением. Это, несомненно, повлияло на дизайн C#, не позволяя это, даже если .NET делает.
По этой причине Array.Initialize() никогда не будет иметь смысла в новых массивах любого типа, написанных на C#, потому что вызов конструктора и нулевое заполнение - это одно и то же.
Но тем не менее, тип может быть написан на другом языке .NET (по крайней мере, вы можете сделать это в CIL), у которого есть конструктор без параметров, который фактически имеет эффект. По этой причине его возможно, что компилятор для такого языка хотел бы, чтобы его эквивалент new SomeValueType[3]
вызывал этот конструктор для всех типов в массиве. И поэтому разумно иметь метод в рамках, который позволяет выполнять такую заливку, чтобы компилятор для такого языка мог ее использовать.
Also, why is it public?
Так можно назвать кодом создаваемого таким гипотетическим конструктору даже в условиях, когда ограничения безопасности предотвратить его вызов частных методов другого узла.
И если вы хотите сбросить значения без создания нового массива, вы, вероятно, также должны использовать 'Array.Clear()'. –
Закрыть? Мне кажется, это правильный вопрос. Может быть, вы просто проголосовали за закрытие по названию? Я знаю. Почему этот метод существует? Какая-то сложность, но если вы прочитаете все вопросы, я уверен, вы согласитесь со мной. –
@ SonerGönül «Почему была разработана такая схема?» - это вопрос о людях, которые его спроектировали. Кто-нибудь еще собирается угадать. Вопрос не подходит для SO; если вы хотите знать, почему Microsoft разработала .NET таким образом, спросите их *. – Servy