Страницы

Поиск по вопросам

понедельник, 25 марта 2019 г.

Скорость выполнения при передаче ссылки на объект

Добрый день! Прошу Вас подсказать мне. Вопрос: какой код будет выполняться быстрее и почему? Или разницы в скорости не будет, т.к передается ссылка на область в куче.
Допустим, есть некоторый тип:
class MyClass { internal int a; public MyClass(int a) { this.a = a; } }
Вариант 1
class Program { static void Main(string[] args) { MyClass myClass = new MyClass(5); Work(myClass.a); }
static void Work(int a) { int b = a + 5; Console.WriteLine(b); } }
Вариант 2
class Program { static void Main(string[] args) { MyClass myClass = new MyClass(5); Work(myClass); }
static void Work(MyClass myClass) { int b = myClass.a + 5; Console.WriteLine(b); } }


Ответ

Все значения переменных передаются по значению:в ссылочных типах значение это ссылка, в значимых - значение.
Конкретно в вашем случае:
пример 1 Work(myClass.a); - Вы обращаетесь к куче и копируете значение из кучи, далее уже работаете с локальной переменной, которая будет храниться в стеке пример 2 Work(myClass); - Вы обращаетесь к переменной myClass и копируете ее значение, т.е. ссылку на область памяти, где хранится объект. В данном случае объектом является класс, поэтому и хранится он в куче. Далее в методе Вы обращаетесь уже к локальной переменной, хранящейся в куче, для извлечения адреса памяти и извлечения значения объекта.
На первый взгляд разница очевидна: передавать по значению проще, но представьте ситуацию, когда вам надо передать миллион значений, а использовать только 1. Тогда быстрее будет передать массив ссылок, чем массив значений.
Если посмотреть на Ваш случай, то разницы практически не видно, но первый метод будет работать быстрее.
О том, где хранятся переменные, можно прочитать здесь

Комментариев нет:

Отправить комментарий