Здравствуйте, Shmj, Вы писали:
S>Кто может ткнуть носом, что значит [socket] — что за конструкция?
S>S>socket.receive([socket](std::vector<unsigned char> data) {
S>
как мы видим на этом куске кода C++ и C# отрогональны друг другу. так в C# лямбда захватывает все что находится в контексте.
Т.t. замкнуть на самом деле значение переменной в в объявлении сишарповой лямбды( анонимной функции ) просто невозможно.
string name = "Alice";
var closure = Closure(name);
var lambda = new Lamda(delegate { WriteLine($"Hello, {name}!"); });
lambda();
closure();
name = "Bob";
lambda();
closure();
Action Closure(string name) => delegate { WriteLine($"Hello, {name}!"); };
public delegate void Lamda();
C++ же в конструкте анонимной функции наворотил еще больше. что проще для понимания хз. ну в плюсах это хотя бы явно.
Как тут уже замечали MS любит придумывать собственную терминологию, что вносит дополнительную путаницу в смыслы той или иной техники.
Здравствуйте, vaa, Вы писали:
vaa>Здравствуйте, Shmj, Вы писали:
S>>Кто может ткнуть носом, что значит [socket] — что за конструкция?
S>>S>>socket.receive([socket](std::vector<unsigned char> data) {
S>>
vaa>как мы видим на этом куске кода C++ и C# отрогональны друг другу. так в C# лямбда захватывает все что находится в контексте.
vaa>Т.t. замкнуть на самом деле значение переменной в в объявлении сишарповой лямбды( анонимной функции ) просто невозможно.
Если почитать вот тут (домотать до How's It Work?):
https://web.archive.org/web/20150707082707/http://diditwith.net/PermaLink,guid,235646ae-3476-4893-899d-105e4d48c25b.aspx
То видно что логика практически идентична. С той лишь разницей что в ++ больше контроля над захватом, а в # захваченная переменная помещается в некий общий контекст и таким образом меняется сразу для всех участников, и продолжает жить по выходу из скоупа.
Если есть сомнения — посмотрите в IL, в последний раз как я это делал так и было )