Добрый день!
Прошу Вас подсказать мне.
Вопрос: какой код будет выполняться быстрее и почему?
Или разницы в скорости не будет, т.к передается ссылка на область в куче.
Допустим, есть некоторый тип:
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. Тогда быстрее будет передать массив ссылок, чем массив значений.
Если посмотреть на Ваш случай, то разницы практически не видно, но первый метод будет работать быстрее.
О том, где хранятся переменные, можно прочитать здесь
Комментариев нет:
Отправить комментарий