Здравствуйте, Аноним, Вы писали:
А>По идее при вызове статического метода проверка должна проходить, но этого не происходит и ссылки оказываются разными. Так и должно быть?
Все должно быть именно так.
Если ты заменишь в своем методе int на object (а так же тип передаваемого объекта), то ReferenceEquals вернет true.
А в твоем случае метод ReferenceEquals возвращает false т.к. перед передачей в метод, происходит боксинг параметров,
и в тело функции попадают уже разные объекты.
Этот код вернет "!Equals".
int i = 5;
if (object.ReferenceEquals(i, i))
MessageBox.Show("Equals");
else
MessageBox.Show("!Equals");
Здравствуйте, у меня есть два вопроса по C#:
1.При отсутствии модификатора для параметра метода (т.е. по умолчанию подразумевается in) значения при вызове метода передаются по значению. При модификаторе ref — по ссылке. А как при out? Как я понимаю ведь тоже должна происходить передача по ссылке?
2. Предположим, что у нас есть следующий код:
class MyClass
{
public static void func(ref int oi, ref int ri)
{
if (object.ReferenceEquals(oi, ri))
System.Console.WriteLine("References are equal.");
System.Console.WriteLine("References are NOT equal.");
}
static void Main(string[] args)
{
int i1 = 100;
MyClass.func(ref i1, ref i1);
}
}
По идее при вызове статического метода проверка должна проходить, но этого не происходит и ссылки оказываются разными. Так и должно быть?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, у меня есть два вопроса по C#:
А>1.При отсутствии модификатора для параметра метода (т.е. по умолчанию подразумевается in) значения при вызове метода передаются по значению. При модификаторе ref — по ссылке. А как при out? Как я понимаю ведь тоже должна происходить передача по ссылке?
В общем и целом да, но не совсем. Если все старые (полученные до входа в процедуру, метод) значения переменной с модификатором out будут удалены. И эта переменная _обязательно_ должна получить значение в методе.
А>2. Предположим, что у нас есть следующий код:
А>А> class MyClass
А> {
А> public static void func(ref int oi, ref int ri)
А> {
А> if (object.ReferenceEquals(oi, ri))
А> System.Console.WriteLine("References are equal.");
А> System.Console.WriteLine("References are NOT equal.");
А> }
А> static void Main(string[] args)
А> {
А> int i1 = 100;
А> MyClass.func(ref i1, ref i1);
А> }
А> }
А>
А>По идее при вызове статического метода проверка должна проходить, но этого не происходит и ссылки оказываются разными. Так и должно быть?
System.Console.WriteLine("References are NOT equal."); будет выполняться ВСЕГДА (или это ошибка именно в примере?). При использовании модификатора ref передается копия ссылки, указывающая на один объект
Здравствуйте, <Аноним>, Вы писали:
А>По идее при вызове статического метода проверка должна проходить, но этого не происходит и ссылки оказываются разными. Так и должно быть?
А боксинг ты учитываешь????
object.ReferenceEquals сравнивает объекты а не value типы.
... << RSDN@Home 1.1.0 stable >>