модификатор параметра. Не уверен, хотя это разрешено в конструкторах ...

у вас есть класс и конструктор, который принимает объект в качестве входного параметра - этот объект передается по ссылке или по значению?

И верно ли предположить, что для методов класса входные параметры объекта по умолчанию передаются по значению, если не используется ключевое слово ref?

Что насчет ключевого слова out? Означает ли это, что оно передается по ссылке?

 SwDevMan8106 янв. 2011 г., 19:28
Скиты получили это здесь, все, что вам нужно знать:yoda.arachsys.com/csharp/parameters.html

Ответы на вопрос(7)

что почти все, что делается с переменной ссылочного типа, неявно делается с тем, на что ссылается ссылка, а не с самой ссылкой. Я считаю полезным думать о ссылочных типах как об идентификаторах экземпляров. Чтобы использовать аналогию, представьте себе экземпляры как автомобили, а ссылочные типы - как листки бумаги с написанными на них идентификационными номерами автомобилей (VIN). Если я скопирую VIN на листок бумаги, передам его кому-нибудь в магазине и скажу «покрасьте этот синий», что я действительно имею в виду: «найдите автомобиль с этим VIN и покрасьте его в синий», а не «покрасьте этот слип» бумаги голубой ". То, что я передаю человеку, это не машина, а просто VIN; однако я говорю ему, чтобы он покрасил в синий цвет, это машина, которая сидит в магазине, а не лист бумаги (или что-либо еще), который я ему на самом деле передаю. Такое использование будет проходить по значению.

Предположим, однако, что я хотел, чтобы кто-то купил машину и дал мне VIN. Я мог бы написать на листе бумаги нужную мне марку, модель, цвет и т. Д., А также вручить человеку листок бумаги, на котором можно написать VIN. В этом случае я хотел бы вернуть листок бумаги с новым VIN на нем. Такое использование будет передавать VIN по ссылке, так как человек будет писать VIN на листе бумаги, который я поставил, и вернуть его мне.

о верно как для ссылочных, так и для типов значений. В случае ссылки это фактическая ссылка, которая передается по значению, а не объекту.

Когдаref или жеout используется ключевое слово, тогда значение действительно передается по ссылке (еще раз верно как для значения, так и для ссылочного типа). На уровне CLR фактически нет разницы междуref а такжеout,out Ключевое слово является понятием C #, которое выражается маркировкойref param (я полагаю, это сделано с помощью modopt)

Решение Вопроса

который принимает объект в качестве входного параметра - этот объект передается по ссылке или по значению?

Все параметры передаются по значению в C #, если параметр не помеченout или жеref.

Это огромный источник путаницы. Я изложу вещи немного более явно.

Все параметры имеют свои значения, если параметр не помеченout или жеref, Для типов значений это означает, что создается копия передаваемого значения. Для ссылочных типов это означает, что копия ссылки сделана. Для этой последней точки значение ссылочного типа является ссылкой.

Верно ли предположить, что для методов класса входные параметры объекта передаются по умолчанию по умолчанию, если толькоref ключевое слово используется?

Опять же, все параметры передаются по значению в C #, если параметр не помечен какout или жеref, Для параметра, отмеченногоrefссылка на параметр передается методу, и теперь вы можете рассматривать этот параметр как псевдоним. Таким образом, когда вы говорите,

void M(ref int m) { m = 10; }

int n = 123;
M(ref n);

ты можешь думать оm вM как псевдоним дляn, Этоm а такжеn просто два разных имени для одного и того же места хранения.

Это очень отличается от

string s = "Hello, world!";
string t = s;

В этом случае,s а такжеt не являются алисами для одного и того же места хранения. Это две разные переменные, которые ссылаются на один и тот же объект.

А как насчет ключевого слова `out? Означает ли это, что оно передается по ссылке?

Единственная разница междуref а такжеout в том, чтоref требует, чтобы переменная была инициализирована перед передачей.

 Andrey06 янв. 2011 г., 17:48
Не правда. Ссылочные объекты передаются по ссылке, в противном случае необходимо будет передать клон объекта. Что делает ссылка, это позволяет изменить ссылку, чтобы ссылаться на другой объект внутри метода.
 jason06 янв. 2011 г., 17:55
@ Андрей: Теперь, вы понизили мой ответ. Пожалуйста, укажите на неправильное утверждение в моем ответе. Спасибо.
 jason06 янв. 2011 г., 17:48
@ Андрей: Вы не правы, неправильно, неправильно. Это копия сделанной ссылки, а не копия референта. Это огромная разница. Я не могу утверждать это достаточно сильно, но ваше понимание очень сбито с толку.
 Andrey06 янв. 2011 г., 18:52
@ Джейсон - хорошо, теперь я думаю, что был неправ. Можете ли вы отредактировать свой ответ, чтобы я мог удалить свой отрицательный голос? Это не позволяет мне сделать это, если вы не коснетесь этого.
 LukeH06 янв. 2011 г., 17:58
@Jason: против, чтобы противостоять незаслуженному понижению голосов. Удивительно, сколько раз такой вопрос задавался на SO, сколько дезинформации было опубликовано, и как много хороших ответов опущено и плохих ответов.

.NET имеет ссылочные типы и типы значений - все классы являются ссылочными типами, а структуры являются типами значений. Вы можете передать один по значению или по ссылке.

По умолчанию все передается по значению, с той разницей, что со ссылочными типамиссылка передается в.

ref а такжеout ключевые слова приведут к передаче параметров по ссылке - в случае типов значений это означает, что теперь вы можете вносить изменения, которые будут отражены в переданном объекте. С ссылочными типами это означает, что теперь вы можете изменить объект, на который ссылается ссылка.

 jim tollan06 янв. 2011 г., 17:59
+1 - ясно и кратко ..

object всегда передается по ссылке на фактический объект. Таким образом, копия объекта (иначе говоря, по значению) не выполняется.

Как толькоОдед Примечания, ссылка на объект копируется.

 JaredPar06 янв. 2011 г., 18:00
@ LukeH, да. К сожалению, слишком долго не могу редактировать. Просто удалено на этом этапе, так как другие комментарии передают сообщение.
 LukeH06 янв. 2011 г., 17:47
Нет, ссылка на объект всегдапередано по значению (если вы не указалиref или жеout параметр).
 LukeH06 янв. 2011 г., 17:51
Но вы обращаетесь к объекту неявно через его ссылку. Эта ссылка передается по значению,не по ссылке. Есть ссылочные типы и типы значений, и есть передача по ссылке и передача по значению. Тип и способ его передачи - это не одно и то же: вы можете передавать типы ref по ref или по значению и передавать типы значений по ref или по значению (по умолчанию это значение передается как для ref, так и для типов значений) ,
 Uwe Keim06 янв. 2011 г., 17:48
@LukeH Он спросил об объекте, а не об объекте, не так ли?
 LukeH06 янв. 2011 г., 17:55
@Jared: В вашем комментарии есть опечатка. Должен предположительно сказать"передано по значению"не"передано по ссылке".

если вы намеревались передать его по ссылке, вы должны использоватьref модификатор параметра. Не уверен, хотя это разрешено в конструкторах ...

@Supercat: Это довольно интересно. путаница заключается в понимании того, почему вы хотите передать ссылочный тип по ссылке!

Расширяя, аналогия только для типов ссылок (я думаю, что типы значений легче понять)

Можно написать один и тот же VIN (номер транспортного средства) на нескольких листах бумаги, поэтому все листки на вашей руке относятся к одной и той же машине. Что если вы напишите «синей краской» на одном листе и «красной краской» на другой? это демонстрирует, что накладные могут содержать только VIN (адрес объекта), а вся другая информация хранится в самом автомобиле.

Если вы заинтересованы в покраске автомобиля в мастерской, вам не нужно отправлять квитанцию, вы можете просто сообщить им VIN ..., который нужно знать, значение, передаваемое по val. Вы по-прежнему держите квитанцию, и они не могут изменить то, что написано на вашей квитанции ... следовательно, это безопаснее. Поэтому они записывают VIN на свой бланк - копию ссылки.

С другой стороны, вы можете попросить коллегу достать с полки квитанцию ​​за последний вымытый автомобиль, подойти к привокзальной площадке и выбрать автомобиль, который не является последним вымытым автомобилем, и вернуть бланк с новым VIN-кодом промытого автомобиля, написанным на нем. - по реф. Используется фактическая квитанция, и вы сослались на адрес фактической квитанции (полки), чтобы он получил квитанцию ​​оттуда. Лучше не терять его и не намочить ... менее безопасно.

Во всей этой палаве никто не говорит о копировании, захвате или перемещении реальной машины, поскольку это НЕ относится к типам значений.

Ваш ответ на вопрос