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

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

30.01.2019, 21:29. Показов 703. Ответов 2
Метки нет (Все метки)

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

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
class Test { 
  public int a, b; 
 
  public Test(int i, int j) { 
    a = i; 
    b = j; 
  } 
 
 
  public void Change(Test ob) { 
    ob.a = ob.a + ob.b; 
    ob.b = -ob.b; 
  } 
} 
 
class CallByRef { 
  static void Main() { 
    Test ob = new Test(15, 20); 
 
    Console.WriteLine("ob.a and ob.b before call: " + 
                       ob.a + " " + ob.b); 
 
    ob.Change(ob); 
 
    Console.WriteLine("ob.a and ob.b after call: " + 
                       ob.a + " " + ob.b);
И еще один вопрос.
В чем смысл делать так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = 10;
            ChangeA(ref a);
            Console.WriteLine(a);
        }
        static void ChangeA(ref int b)
        {
            b++;
        }
    }
   
}
Если можно сделать так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = 10;
            ChangeA(a);
        }
        static void ChangeA( int b)
        {
            b++;
            Console.WriteLine(b);
        }
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.01.2019, 21:29
Ответы с готовыми решениями:

Передача объектов методам по ссылке
Здравствуйте. не могу разобраться с этим примером из книги Шилдта.using System; class MyClass { int alpha, beta; public...

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

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

2
228 / 165 / 110
Регистрация: 09.11.2015
Сообщений: 454
30.01.2019, 22:02
Цитата Сообщение от Daniil_123 Посмотреть сообщение
Если можно сделать так
А если далее в методе Main потребуется использовать измененную переменную a?

Добавлено через 2 минуты
Цитата Сообщение от Daniil_123 Посмотреть сообщение
Прошу объяснить по-проще, что, откуда и зачем
Простой пример, демонстрирующий, что класс - это ссылочный тип. В метод передается не копия ob, а ссылка не него.
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
30.01.2019, 23:25
Цитата Сообщение от Daniil_123 Посмотреть сообщение
И еще один вопрос.
В чем смысл делать так:
Цитата Сообщение от Daniil_123 Посмотреть сообщение
Если можно сделать так:
Тут сразу же уже видно, что название метода не соответствует тому, что он по факту выполняет.

Добавлено через 1 минуту
Как минимум, этот метод почему-то называется "Изменить" и судя по параметрам явно речь о переменной, переданной по ссылке, а по факту изменяет значение и визуализирует его, хотя визуализацией должен заниматься какой-то другой компонент (в данном случае метод).

Добавлено через 20 минут
Вот почему не нужно делать так, как по идее можно. Ты можешь хоть 10 раз изменить значение, а вот вывести на экран лишь один раз или 100 раз, как захочешь. Если ты будешь в одном методе делать два разных действия, ты сильно ограничиваешь область применения этого метода. Тем более, сейчас это консольное приложение, а завтра тебе нужно добавлять в HTML разметку результат работы метода Change(ref int....
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
using System;
using System.Collections.Generic;
 
namespace ConsoleApp1
{
    public enum VisualizationLevel
    {
        Int32,
        Bits
    }
 
    public interface IDataVisualizer<T>
    {
        void Display(string description, T data);
    }
 
    public class ConsoleInt32Visualizer : IDataVisualizer<int>
    {
        public void Display(string description, int value)
        {
            Console.WriteLine($"{nameof(ConsoleInt32Visualizer)} >>> {value:D3} <<< == {description}");
        }
    }
 
    public class ConsoleLowLevelVisualizer : IDataVisualizer<int>
    {
        public void Display(string description, int value)
        {
            string bits = Convert.ToString(value, 2);
            Console.WriteLine($"{nameof(ConsoleLowLevelVisualizer)} >>> {value:D3}={bits} <<< == {description}");
        }
    }
 
    class Program
    {
        private static readonly Dictionary<VisualizationLevel, IDataVisualizer<int>> _dataVisualizers = new Dictionary<VisualizationLevel, IDataVisualizer<int>>()
        {
            { VisualizationLevel.Int32, new ConsoleInt32Visualizer() },
            { VisualizationLevel.Bits, new ConsoleLowLevelVisualizer() },
        };
 
        private static void Main(string[] args)
        {
            var visualizer = _dataVisualizers[VisualizationLevel.Int32];
 
            int value = 10;
            visualizer.Display("Начальное значение", value);
 
            Change(value, 40);
            visualizer.Display("После вызова Change(value, 40)", value);
 
            Change(ref value, 95);
            Change(ref value, 95);
            visualizer.Display("После вызова 2x: Change(ref value, 95)", value);
 
            Console.ReadKey(true);
        }
 
        private static void Change(ref int value, int summand)
        {
            value += summand;
        }
 
        private static void Change(int value, int summand)
        {
            value += summand;
        }
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.01.2019, 23:25
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
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&amp;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