Но что на самом деле назначено на a
?
Тип a
равен List<int>
, а списки являются ссылочными типами, поэтому переменная содержит ссылку насписок. C # не лжет вам.Тип переменной - это тип переменной .
, она работает как функция, но вызывается как обычный объект.
Это предложение не имеет смысла и указывает на то, что у вас есть некоторое недопонимание того, как работает C #.«Объекты» - это не вещи, которые «называются», если они не являются делегатами.Похоже, вы путаете свойства, переменные, объекты и делегаты. Узнайте, что это за вещи .Будет сложно добиться успеха в программировании на C #, если вы не знаете правильных имен всех частей.
Я думаю, вы хотели сказать, что свойство - это член, доступ к которому осуществляется следующим образом.поле, но чтение и запись свойства реализованы как вызовы методов доступа к элементам .
Я имею в виду, что если я буду работать с a
, будет ли вызвана функция getснова каждый раз?
Вы можете сами ответить на этот вопрос, попробовав его:
myInstance.MyList = new List<int> { 10, 20, 30 };
List<int> a = myInstance.MyList;
myInstance.MyList = new List<int> { 100, 200, 300 };
Console.WriteLine(a[0]);
Если a
снова выберет свойство, оно должно быть 100. Если это не так, должно быть 10. Сделайте прогноз о том, что произойдет, а затем попробуйте и посмотрите, были ли вы правы.
Если я использую это в многопоточном случае с некоторой блокировкой объектав функции get и set я не хочу обходить блокировку.Так что, если я сначала назначу MyList
на a
, а затем поработаю с ним, он больше не будет заблокирован?Я прав?
Да.Я воспользуюсь этой возможностью, чтобы указать, что крайне плохая практика программирования - создавать открытый интерфейс, который предоставляет объект, который должен быть заблокирован .Лучшие варианты:
- Не пишите многопоточные программы.Правильно понять их очень сложно.
- Если вам нужно, не пишите многопоточные программы, которые совместно используют память между потоками.
- Если вам нужно совместно использовать память, используйте коллекции, безопасные для потоков, всегда .