#c# #parameter-passing
#c# #передача параметра
Вопрос:
Когда вы передаете переменную в объект во время создания экземпляра, например, в
SomeObject newObject = new SomeObject() { SomeString = "String goes here" };
Будет ли переменная someString доступна в конструкторе или она будет назначена впоследствии? Если бы мне нужно было использовать его в конструкторе, сработало бы это или мне нужно было бы передать его в качестве параметра, используя
new SomeObject("String goes here");
Комментарии:
1. Помимо незначительного: если вы задаете свойства при создании экземпляра подобным образом, вам не нужен
()
, а также вы можете смешивать параметры конструктора с{ .. }
синтаксисом.2. @Flynn1179 в чем разница между not having () и having ()
3. Нет; они просто не нужны в конструкторах без параметров, если вы используете инициализатор, подобный этому.
Ответ №1:
будет ли переменная someString доступна в конструкторе или она будет назначена впоследствии?
Он будет назначен впоследствии.
SomeObject newObject = new SomeObject() { SomeString = "String goes here" };
примерно эквивалентно / синтаксический сахар для:
SomeObject temp = new SomeObject();
temp.SomeString = "String goes here";
SomeObject newObject = temp;
Комментарии:
1. @lukas, да, есть
temp
. В реальном мире он не вызываетсяtemp
, но имя специально генерируется компилятором C #, чтобы избежать любых столкновений имен. Временный объект используется компилятором для обеспечения того, чтобы ваша ссылка могла ссылаться только на правильно инициализированный объект. Так, например, переменная не присваивается полностью инициализированному объекту, пока не будут установлены все свойства, поэтому, если генерируется исключение, созданный объект теряется, даже если исключение перехвачено (переменная останется null или любым другим значением, которое она имела ранее).2. @darin-dimitrov означает ли это, что было бы эффективнее просто использовать SomeObject newObject = new SomeObject(); someString — «Строка идет сюда»; ?
Ответ №2:
В первом случае он будет назначен впоследствии. ПРИМЕЧАНИЕ: Для этого требуется наличие конструктора без параметров, который будет существовать по умолчанию, если вы не определите параметризованный конструктор. В этом случае вы должны явно определить оба конструктора.
Для получения более подробной информации вы можете ознакомиться с подробностями о инициализаторах объектов.
Комментарии:
1. Вы можете сделать это, если нет деструктора без параметров. Синтаксис
SomeObject newObject = new SomeObject(Object constructorParam) { SomeString = "String goes here" };
2. Я полагаю, вы имели в виду конструктор (не деструктор, поскольку это не имеет отношения к вопросу). Помимо этого, да, вы можете иметь только параметризованный конструктор и по-прежнему передавать строку в качестве свойства, но тогда вам потребуется передать объект конструктору, чего OP не делает и не запрашивает. Вопрос в том, можно ли получить доступ к строке, передаваемой через свойство, в конструкторе, что невозможно, если только она не передается напрямую.
3. Да, как, черт возьми, я это пропустил .. извините! В любом случае, чтобы уточнить, я имел в виду общий случай, а не этот конкретный вопрос, но в данном случае вы, конечно, правы.