Если бы вы могли просто написать SomeClassType x;
и автоматически инициализировать его, это не позволило бы конструкторам с какими-либо параметрами. Не каждый SomeClassType
будет иметь конструктор без параметров; как компилятор узнает, какие аргументы нужно указать?
public class Repository
{
private IDbConnection connection;
public Repository(IDbConnection connection)
{
if (connection == null)
{
throw new ArgumentNullException("connection");
}
this.connection = connection;
}
}
Как бы вы создали этот объект с помощью Repository rep;
? Для правильной работы требуется зависимый объект.
Не говоря уже о том, что вы можете написать такой код:
Dictionary<int, SomeClass> instances = GetInstancesFromSomewhere();
SomeClass instance;
if (instances.TryGetValue(1, out instance))
{
// Do something
}
Вы действительно хотите, чтобы он автоматически инициализировался для вас?
Если вы только что написали SomeClassType x = SomeClassType()
, тогда это не делает различий между конструктором и методом в области видимости.
В более общем смысле :
Я думаю, что существует фундаментальное недопонимание того, для чего используется ключевое слово new
. Тот факт, что типы значений выделяются в стеке, а «ссылочные» типы выделяются в куче, является подробностью реализации . Ключевое слово new
является частью спецификации . Как программист, вам все равно, будет ли он выделяться в куче или стеке (большую часть времени), но вам нужно указать , как инициализируется объект .
Существуют и другие допустимые типы инициализаторов, такие как:
int[] values = { 1, 2, 3, 4 };
Вуаля, инициализация без new
. В этом случае компилятор был достаточно умен, чтобы понять это за вас, потому что вы предоставили буквальное выражение, которое определяет весь объект.
Так что я предполагаю, что мой «ответ» таков: не беспокойтесь о том, где объект существует в памяти; используйте ключевое слово new
по назначению, в качестве инициализатора объекта для объектов, требующих инициализации.