|
Передача объекта по ссылке в асинхронный метод
|
|||
---|---|---|---|
#18+
Всем привет, компилятор при попытке передачи объекта класса в асинхронный метод по ссылке пишет ошибку: У асинхронных методов не может быть параметров ref и out , однако если предварительно упаковать этот объект в результат Linq-запроса, то его осуществить можно. Код: 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. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79.
По умолчанию C# передает аргументы в методы по значению, однако метод change_propertyByLinq отрабатывает как будто ему передали аргумент по ссылке. Вопрос: это частный случай и не факт что если в других ситуациях я передам также объект как результат linq, то оно передасться по ссылке? Почему такое противоречие, что асинхронный метод не может принимать аргументы по ссылке, но если немного подизменить код то получается аналогичный результат? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2018, 10:24 |
|
Передача объекта по ссылке в асинхронный метод
|
|||
---|---|---|---|
#18+
авторПо умолчанию C# передает аргументы в методы по значению это относится только в структурам, класс передаются по ссылке ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2018, 10:54 |
|
Передача объекта по ссылке в асинхронный метод
|
|||
---|---|---|---|
#18+
Roman Mejtes, тогда бы Код: c# 1.
и Код: c# 1.
было бы идентичным ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2018, 11:12 |
|
Передача объекта по ссылке в асинхронный метод
|
|||
---|---|---|---|
#18+
vb_subRoman Mejtes, тогда бы Код: c# 1.
и Код: c# 1.
было бы идентичным Ничего подобного. Ссылка на локальную переменную - это адрес в куче, хранящийся на стеке, и этот адрес как ссылка передается по значению, поэтому непосредственно саму ссылку, переданную в метод, модифицировать нельзя. Если ссылка передается ref-параметром, то передается не сама ссылка, а её адрес на стеке, и саму ссылку уже можно модифицировать: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
в консоли: Код: plaintext 1.
- т.е. в первом случае попытка модфикации ссылки ничем не закончилась - как только мы вышли из Foo1, его фрейм стека зачистился, и в точке возврата мы опять имели дело со старой ссылкой на StringBuilder. Во втором случае мы вполне успешно модифицировали ссылку, т.к. был передан её адрес на стеке метода Main, и далее уже имели дело с модифицированной ссылкой. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2018, 11:30 |
|
Передача объекта по ссылке в асинхронный метод
|
|||
---|---|---|---|
#18+
P.S. Я думаю, разница между модификацией состояния объекта по ссылке, и модификация самой ссылки, вопросов не вызывает? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2018, 11:31 |
|
Передача объекта по ссылке в асинхронный метод
|
|||
---|---|---|---|
#18+
vb_subУ асинхронных методов не может быть параметров ref и out , однако если предварительно упаковать этот объект в результат Linq-запроса, то его осуществить можно. Нет, не можно. Это будет совсем другое. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2018, 12:09 |
|
Передача объекта по ссылке в асинхронный метод
|
|||
---|---|---|---|
#18+
Сон Веры Павловны, Код: c# 1. 2. 3. 4. 5.
и дальше Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
после завершения получим Foo Foo2 ver2 - в чем то различия у классов StringBuilder и Person ? ведь ссылка объект класса Person передан в метод ChangePerson, изменялась ссылка и по завершении метода изменения сохраняются. у StringBuilder изменения ссылки не сохраняются после выхода из метода, у Person - сохраняются - получается так ? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2018, 10:06 |
|
Передача объекта по ссылке в асинхронный метод
|
|||
---|---|---|---|
#18+
monstrUу StringBuilder изменения ссылки не сохраняются после выхода из метода, у Person - сохраняются - получается так ?Нет. Почитайте документацию https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/method-parameters Parameters declared for a method without in, ref or out, are passed to the called method by value. That value can be changed in the method, but the changed value will not be retained when control passes back to the calling procedure. By using a method parameter keyword, you can change this behavior. А "расширить" пример С.В.П. следовало бы как-то так Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2018, 11:03 |
|
Передача объекта по ссылке в асинхронный метод
|
|||
---|---|---|---|
#18+
monstrU- в чем то различия у классов StringBuilder и Person ? ведь ссылка объект класса Person передан в метод ChangePerson, изменялась ссылка и по завершении метода изменения сохраняются. у StringBuilder изменения ссылки не сохраняются после выхода из метода, у Person - сохраняются - получается так ? И с чего же вдруг у Person в вышеприведенном изменилась ссылка? Изменилось содержимое объекта в куче по адресу, куда указывает ссылка, а сама ссылка осталось той же. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2018, 11:28 |
|
Передача объекта по ссылке в асинхронный метод
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныmonstrU- в чем то различия у классов StringBuilder и Person ? ведь ссылка объект класса Person передан в метод ChangePerson, изменялась ссылка и по завершении метода изменения сохраняются. у StringBuilder изменения ссылки не сохраняются после выхода из метода, у Person - сохраняются - получается так ? И с чего же вдруг у Person в вышеприведенном изменилась ссылка? Изменилось содержимое объекта в куче по адресу, куда указывает ссылка, а сама ссылка осталось той же. спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2018, 11:41 |
|
|
start [/forum/topic.php?fid=20&fpage=29&tid=1399324]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
49ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
others: | 291ms |
total: | 426ms |
0 / 0 |