Aktywne Wpisy

patryk_66 +723

lkjp +274
W końcu koniec najbardziej żałosnej pory roku. Za chwilę spocone baby, udarowcy i wiecznie narzekający rolnicy pójdą przynajmniej na chwilę w zapomnienie. Już niedługo czekają nas cudowne ciemne poranki, deszczowe mgliste dni i wczesny wieczór. Znowu będzie czym oddychać. Gówniarze będą smętnie kroczyć podczas szarówki w kierunku szkół. Życzę sobie i Wam moi mili, aby ##!$%@? oraz ##!$%@?. Z kolei wszystkim miłośnikom lampy 30 stopni serdeczna parówa w okrężnicę.





Okazuje się, że wyrażenia lambda mają swój własny cykl życia zmiennych. Zmienne są trzymane w wyrażeniach lambda, nawet wtedy, kiedy ich zakres powinien się już skończyć i GC powinien je zgarnąć. Dlatego, gdybyśmy przekazali zmienną przez ref, moglibyśmy kiedyś zakończyć jej życie, a lambda nie mogłaby się do niej odwoływać. Lekko zmodyfikowałem przykład z MSDNu na swoje potrzeby, żeby pokazać, jak to działa:
delegateboolBoolDel();
delegateintIntDel();
``````
classProgram
{
BoolDel boolDel;
IntDel intDel;
``````
publicvoidTestMethod(intx)
{
inty = 1;``````
//Inicjalizacja delegatów
//boolDel zostanie wywołany 2 razy poza TestMethod do sprawdzenia,
// czy nasze zmienne są równe
boolDel = () => {
returny == x; };``````
//intDel zostanie wywołany raz w środku TestMethod i raz poza nią
intDel = () => { y *= 2;
returny; };
``````
varresult = intDel();``````
//Wyjście: y:2
Console.WriteLine(
"y:{0}", result);
}
``````
staticvoidMain(string[] args)
{
intx = 4;
varprogram =newProgram();
``````
program.TestMethod(x);
``````
//Wywołanie boolDel już powinno wystarczyć jako dowód na to,
// że y nie zakończyło swojego zakresu wraz z końcem TestMethod()
varcondition = program.boolDel();``````
//Wynik jest prosty, przecież x: 4, y: 2
//Wyjście: condition:false
Console.WriteLine(
"condition:{0}", condition);
``````
//Kolejne wywołanie intDel to dowód, że lambda przechowuje
// referencję do zmiennej, a nie jej kopię.
varresult = program.intDel();``````
//Wyjście: y:4
Console.WriteLine(
"y:{0}", result);``````
//Zmieniam x. Nie ma to znaczenia teraz,
// ponieważ wiem i tak, co uzyskam w kolejnym wywołaniu boolDel,
// ale przyda się w dalszej części moich zabaw.
x = 10;
``````
condition = program.boolDel();
``````
//Do metody TestMethod podaliśmy x o wartości 4
// i lambda przechowuje referencję do kopii x z TestMetchod(),
// a nie referencję do x.
//Wyjście: condition:true
Console.WriteLine(
"condition:{0}", condition);
``````
Console.ReadKey();
}
}
To mój pierwszy taki wpis, więc dajcie znać, czy się podoba, czy się nadaje do #programowanie, czy nie zbyt oczywiste, bo może wszyscy czytają MSDN od deski do deski i to wiedzą, a tylko ja się nie spotkałem, czy wgl zawracać sobie głowę itd. Jak gdzieś się mylę, to poprawiać koniecznie.
#csharp #maavdevelopment #justjuniorthings
unsafepublicvoidTestMethod(int* x)
{
inty = 1;boolDel = () => {
returny == *x; };intDel = () => { y *= 2;
return