Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.63/54: Рейтинг темы: голосов - 54, средняя оценка - 4.63
0 / 1 / 0
Регистрация: 06.05.2012
Сообщений: 20

Передача объектов методам по ссылке

12.05.2012, 16:27. Показов 10333. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. не могу разобраться с этим примером из книги Шилдта.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
using System; 
class MyClass { 
int alpha, beta; 
public MyClass(int i, int j) { 
alpha = i; 
beta = j; 
} 
// Возвратить значение true, если параметр ob 
// имеет те же значения, что и вызывающий объект. 
public bool SameAs(MyClass ob) { 
if((ob.alpha == alpha) & (ob.beta == beta)) 
return true; 
else return false; 
} 
// Сделать копию объекта ob. 
public void Copy(MyClass ob) { 
alpha = ob.alpha; 
beta = ob.beta; 
} 
public void Show() { 
Console.WriteLine("alpha: {0}, beta: {1}", 
alpha, beta); 
            } 
} 
            class PassOb { 
                    static void Main() { 
                    MyClass ob1 = new MyClass (4, 5); 
                    MyClass ob2 = new MyClass (6, 7); 
                    Console.Write("obi: "); 
                    ob1. Show () ; 
                    Console.Write("ob2: "); 
                    ob2.Show(); 
                    if(ob1.SameAs(ob2)) 
                    Console.WriteLine("obi и оЬ2 имеют одинаковые значения."); 
                    else 
                    Console.WriteLine("obi и оЬ2 имеют разные значения."); 
                    Console.WriteLine() ; 
                    //А теперь сделать объект obi копией объекта оЬ2. 
                    ob1.Copy(ob2); 
                    Console.Write("obi после копирования: "); 
                    ob1.Show(); 
                    if (ob1.SameAs(ob2)) 
                    Console.WriteLine("obi и оЬ2 имеют одинаковые значения."); 
                    else 
                    Console.WriteLine("obi и оЬ2 имеют разные значения."); 
                } 
}
А именно, как работает вот эта часть кода: "if(ob1.SameAs(ob2))". Вроде бы должны передаваться аргументы "ob1" при вызове SameAs, но тут же и "ob2"?
А там в "public bool SameAs(MyClass ob)" откуда "ob" взялась? Мы ее не объявляли и не инициализировали, объект такой не создавали.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.05.2012, 16:27
Ответы с готовыми решениями:

Передача объектов методам по ссылке
Здравствуйте! Читаю Шилдта C# и дошел до главы Передача объектов методам по ссылке. Прошу объяснить по-проще, что, откуда и зачем. ...

Передача объектов методам
Дан код public class Cards { public string Title; //Название карты public double Cost; //Стоимость карты ...

передача объектов методам C#
Всем доброго времени суток! Только-только начал учить C#. Возникла следующая проблема: имеется структура, одним из членов которой является...

29
 Аватар для anonimus
2184 / 1255 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
12.05.2012, 16:41
Цитата Сообщение от Понаехал Посмотреть сообщение
Вроде бы должны передаваться аргументы "ob1"
почему?
в коде сравниваются поля метода ob1 и ob2
Цитата Сообщение от Понаехал Посмотреть сообщение
откуда "ob" взялась?
ее не нужно объявлять, это параметр который принимает функция
0
0 / 1 / 0
Регистрация: 06.05.2012
Сообщений: 20
12.05.2012, 16:48  [ТС]
С первым - да, я разобрался спасибо. Просто запутался слегка.
А вот со вторым вопросом так и не понимаю, не могли бы вы подробнее расписать?
Вот мы передаем в public bool SameAs значение ob2 (6, 7), а дальше что и почему ob это параметр, который принимает функция?
0
4 / 4 / 0
Регистрация: 11.05.2012
Сообщений: 53
12.05.2012, 17:55
Цитата Сообщение от anonimus Посмотреть сообщение
метода ob1 и ob2
Поясните пожалуйста, почему вы называете ob1 и ob2 методами.
0
0 / 1 / 0
Регистрация: 06.05.2012
Сообщений: 20
12.05.2012, 18:19  [ТС]
наверное, имеется в виду ob1.SameAs() (как пример), а не просто ob1

Добавлено через 14 минут
Почитал, почитал --
Я правильно понял, что ob это просто ссылка на ранее объявленные объекты MyClass? Просто вот так вот объявляются/пишутся ссылки?
0
4 / 4 / 0
Регистрация: 11.05.2012
Сообщений: 53
12.05.2012, 18:31
Цитата Сообщение от Понаехал Посмотреть сообщение
Я правильно понял, что ob это просто ссылка на ранее объявленные объекты MyClass? Просто вот так вот объявляются/пишутся ссылки?
ob это переменная, которая ссылается на объект
0
0 / 1 / 0
Регистрация: 06.05.2012
Сообщений: 20
12.05.2012, 18:45  [ТС]
Но переменные же надо объявлять и типизировать, если это не var? Даже если var объявлять-то все равно надо.
0
4 / 4 / 0
Регистрация: 11.05.2012
Сообщений: 53
12.05.2012, 18:53
Цитата Сообщение от Понаехал Посмотреть сообщение
Но переменные же надо объявлять и типизировать, если это не var?
Я сам сейчас книгу Шилдта (С# 4.0 Полное руководство) читаю, поэтому могу порекомендовать открыть ее на странице 153 "Создание объектов". Он пишет что в строке типа MyClass ob1 = new MyClass (4, 5) объявляется переменная ob1, создается физическая копия объекта (с помощью оператора new), и затем переменной ob1 присваивается ссылка на объект. Судя по логике типизировать переменную, которая ссылается на объект не нужно.
1
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9673 / 4825 / 763
Регистрация: 17.04.2012
Сообщений: 9,664
Записей в блоге: 14
12.05.2012, 19:02
Цитата Сообщение от Понаехал Посмотреть сообщение
Я правильно понял, что ob это просто ссылка на ранее объявленные объекты
В самом теле метода
C#
1
2
3
4
5
public bool SameAs(MyClass ob) { 
    if((ob.alpha == alpha) & (ob.beta == beta)) 
        return true; 
    else return false; 
}
ob - это входной аргумент метода, вы передаёте ранее созданный объекта типа MyClass, чтобы воспользоваться им в теле метода.


Цитата Сообщение от Понаехал Посмотреть сообщение
Но переменные же надо объявлять и типизировать, если это не var?
Точно. Если вы вместо типа переменной используете var, компилятор сам подставляет имя типа во время компиляции.

Цитата Сообщение от akeee Посмотреть сообщение
Судя по логике типизировать переменную, которая ссылается на объект не нужно
Нужно, может это произойдёт автоматически,но всё-равно нужно. Когда компилятор будет знать тип переменной, он будет знать, какие члены у данного типа, на этом строится безопасность типов в CLR
2
4 / 4 / 0
Регистрация: 11.05.2012
Сообщений: 53
12.05.2012, 19:41
Теперь и я не понимаю. В методе SameAs с чем сравнивают ob.alpha и ob.beta?

Добавлено через 26 минут
я имею в виду чему равны alpha и beta в if((ob.alpha == alpha) & (ob.beta == beta)), если ob.alpha = 6 и ob.beta = 7
0
0 / 1 / 0
Регистрация: 06.05.2012
Сообщений: 20
12.05.2012, 19:44  [ТС]
Я сам сейчас книгу Шилдта (С# 4.0 Полное руководство) читаю, поэтому могу порекомендовать
Да-да, мы читаем ее вместе
Перечитал рекомендованную главу и думал, что понял исходя из этого
Building house; // объявить ссылку на объект
что просто в такой (MyClass ob) форме объявляется переменная-ссылка ob, ссылающаяся на объекты в MyClass, но оказывается, что
ob - это входной аргумент метода
но аргументы всегда до этого объявляли и типизировали... В общем, опять запутался.
И как это дальше происходит в операторе if тоже не совсем понятно; т.е. мы передаем 6, 7., а какие числовые значение принимает это выражение ob.alpha == alpha?
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9673 / 4825 / 763
Регистрация: 17.04.2012
Сообщений: 9,664
Записей в блоге: 14
12.05.2012, 20:10
Цитата Сообщение от akeee Посмотреть сообщение
Теперь и я не понимаю. В методе SameAs с чем сравнивают ob.alpha и ob.beta?
В классе есть поля alpha и beta, объявленные на уровне класса
C#
1
2
3
4
class MyClass { 
    int alpha, beta; 
    public MyClass(int i, int j) {
    //...
а это значит, что они будут видны во всех методах этого класса. Поэтому методе SameAs ob.alpha и ob.beta сравнивают с alpha и beta данного объекта. Весь смысл этого метода и заключается в том, что бы сравнить 2 объекта одного и того же типа.
Цитата Сообщение от Понаехал Посмотреть сообщение
И как это дальше происходит в операторе if тоже не совсем понятно; т.е. мы передаем 6, 7., а какие числовые значение принимает это выражение ob.alpha == alpha?
ob.alpha = 6, alpha задаётся при создании экземпляра класса
C#
1
MyClass ob1 = new MyClass (4, 5);
т.е. 4
2
4 / 4 / 0
Регистрация: 11.05.2012
Сообщений: 53
12.05.2012, 20:41
Вводит в заблуждение указанные переменные alpha(beta) в
C#
1
if((ob.alpha == alpha) & (ob.beta == beta))
Как будто им были присвоены значения напрмер сразу после их объявления
C#
1
2
3
int alpha, beta;
alpha = 4;
beta = 5;
А если им были присвоены значения при создании экземпляра класса (т.е. присвоены значения копиям переменным экземпляра), почему уловие не такое?
C#
1
if((ob.alpha == ob1.alpha) & (ob.beta == ob1.beta))
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9673 / 4825 / 763
Регистрация: 17.04.2012
Сообщений: 9,664
Записей в блоге: 14
12.05.2012, 20:58
Цитата Сообщение от akeee Посмотреть сообщение
Как будто им были присвоены значения напрмер сразу после их объявления
Так и есть, просто вот этого
C#
1
2
alpha = 4;
beta = 5;
напрямую нет в коде, но CLR передаёт им такие значения.
Цитата Сообщение от akeee Посмотреть сообщение
почему уловие не такое
C#
1
if((ob.alpha == ob1.alpha) & (ob.beta == ob1.beta))
Класс MyClass ничего не знает об ob1, когда производит сравнение, он знает значение своих переменных. Но раз уж вы клоните к тому, что нужно указывать полное имя переменной с экземпляром класса, содержащего её, то просто alpha
C#
1
ob.alpha == alpha
это сокращенная запись от
C#
1
ob.alpha == this.alpha
т.е. alpha - это эквивалент this.alpha, а по this, как вы наверное уже догадались, передаётся экземпляр текущего класса.
Если это так всё трудно даётся, советую почитать книги по объектно-ориентированному программированию.
2
 Аватар для Евгений В
912 / 672 / 134
Регистрация: 01.03.2010
Сообщений: 1,279
12.05.2012, 21:58
Объект ob1 имеет поля alpha и beta , которые имеют какие то значения.
У объекта ob2 то же есть поля alpha и beta. Которые то же имеют какие то значения.

Посмотрим на метод
C#
1
2
3
4
5
public bool SameAs(MyClass ob) { 
if((ob.alpha == alpha) & (ob.beta == beta)) 
return true; 
else return false; 
}
и, теперь на объект, который его вызывает
C#
1
2
 if(ob1.SameAs(ob2)) 
  Console.WriteLine("obi и оЬ2 имеют одинаковые значения.");
Что мы видим? Объект ob1 имеет alpha и beta и вызывает свой метод SameAs . Он (объект) их видит в своем методе. Но он не видит чужие alpha и beta. Их можно увидеть, только указав интересующий объект (который получен по ссылке). А это ob.alpha и ob.beta.
А так, как по ссылке мы передаем объект ob2, то работая с ob.alpha мы фактически работаем с ob2.alpha и т.д.
2
0 / 1 / 0
Регистрация: 06.05.2012
Сообщений: 20
12.05.2012, 22:10  [ТС]
Да-да, эти alpha и beta там равны 4 и 5, потому что вызываются через ob1.SameAs, если здесь заменить на ob2.SameAs, то вызовется значения переданные при создании ob2 и соответственно сравнение даст true о чем и напишет в консоли.
Спасибо друзья, что так подробно все объяснили, особенно вам tezaurismosis.
Правда, у меня насчет ob так и остались некоторые неясности

akeee, а вы для себя четко уяснили, что такое ob?
0
 Аватар для Евгений В
912 / 672 / 134
Регистрация: 01.03.2010
Сообщений: 1,279
12.05.2012, 22:18
Цитата Сообщение от Понаехал Посмотреть сообщение
Правда, у меня насчет ob так и остались некоторые неясности
Тогда вам нужно разобраться, что такое ссылка.
Мы создали переменную ob типа MyClass . Теперь она может ссылаться на объект ob1 или ob2 и т.д Смотря что нужно
2
0 / 1 / 0
Регистрация: 06.05.2012
Сообщений: 20
12.05.2012, 22:51  [ТС]
А, ну теперь, кажется, понял. Т.е. ob.alpha и ob.beta в данном случае равны 6 и 7, потому что мы при вызове передаем ob1.SameAs(ob2), т.е. в этот момент она "понимает", что нужно ссылаться на значения alpha и beta, которые мы передали при создании ob2.
Так?
0
4 / 4 / 0
Регистрация: 11.05.2012
Сообщений: 53
12.05.2012, 22:53
Понаехал,

Если я правильно понимаю Евгений В и tezaurismosis, при вызове SameAs(MyClass ob) создается переменная ob ("Building house; // объявить ссылку на объект"). При этом ob в данном контексте является параметром, которому передается ссылка на ob2 (из ob1.SameAs(ob2)) в качестве аргумента. Возможно я ошибаюсь, но данная операция напоминает пример из Шилдта (стр 154 "Переменные ссылочного типа и присваивание")

C#
1
2
Building house1 = new Building();
Building house1 = house2;
т.е. ob и ob2 ссылаются на один и тот же объект.
1
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9673 / 4825 / 763
Регистрация: 17.04.2012
Сообщений: 9,664
Записей в блоге: 14
12.05.2012, 22:58
Цитата Сообщение от Понаехал Посмотреть сообщение
в этот момент она "понимает", что нужно ссылаться на значения alpha и beta, которые мы передали при создании ob2.
Почти так; среда исполнения передаёт методу SameAs объект ob2, оттуда и будут браться alpha и beta. Если бы вы создали ещё один объект, например
C#
1
2
MyClass ob3 = new MyClass (6, 7);
if(ob1.SameAs(ob3)) { //...
то в метод передался бы объект ob3, и тогда бы из него бы брались alpha и beta

Добавлено через 1 минуту
Цитата Сообщение от akeee Посмотреть сообщение
При этом ob в данном контексте является параметром, которому передается ссылка на ob2 (из ob1.SameAs(ob2)) в качестве аргумента
Да
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.05.2012, 22:58
Помогаю со студенческими работами здесь

ООП. Передача объектов методу по ссылке
Исходный код программы: using System; using System.Collections.Generic; using System.Linq; using System.Text; using...

Array.Clone() и передача объектов по ссылке - разобрать код
Добрый день. Возникла маленькая проблема. На сколько мне известно функция clone используется для создания неполной копии объекта...

Где и как создать массив объектов, чтобы можно было получить доступ к методам этих объектов?
Задача: "в win form кликаю на кнопку (button) и в этот момент в одном из массивов экземпляров класса должен вызваться метод" ...

Передача объектов методам (пример Г.Шилдт)
В книге Шилдта для начинающих есть пример class Block { int a, b, c; int volume; Block (int i, int j, int k) { //...

Передача объектов методу по ссылке
Я не совсем понимаю, если объект передаётся методу в качестве аргумента только по ссылке и в отличии от простых типов данных всегда ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru