Articles of chiusure

L’allocazione dell’heap di chiusura C # si verifica all’inizio del metodo

Mi sembra di essere imbattuto in qualche strano comportamento del compilatore C #. Considera il seguente esempio di codice: static void Main(string[] args) { Foo(false, 8); } public static void Foo(bool execute, int x) { if (execute) { Task.Run(() => Console.WriteLine(x)); } } L’esecuzione di questo (in versione) mostra alcune allocazioni impreviste che si verificano. […]

La variabile catturata dalla chiusura modifica anche l’originale

Ho il seguente codice semplice: static void Main(string[] args) { int j = 0; Func f = () => { for (int i = 0; i < 3; i++) { j += i; } return j; }; int myStr = f(); Console.WriteLine(myStr); Console.WriteLine(j); Console.Read(); } Da ciò che leggo quando sono coinvolte le chiusure, un […]

Questa correzione del Resharper per l’avviso di chiusura eliminata ha senso?

Sto lavorando per eliminare alcuni avvisi da un’analisi del codice statico. In un caso specifico non è stato effettuato alcun smaltimento su ManualResetEvent . Il codice in questione esegue un Func sul thread principale e blocca il thread chiamante per un determinato numero di millisecondi. Mi rendo conto che sembra una cosa strana da fare, […]

Le chiusure interrompono la serializzazione

Oggi ho affrontato una SerializationException che si riferiva ad una class interna anonima +c__DisplayClass10 affermando che non era serializzabile, quando IIS ha provato a memorizzare la sessione nel servizio di stato di ASP.NET: Digitare ‘Xyz.GeneralUnderstandingTests + ASerializableType + c__DisplayClass10’ in Assembly ‘Xyz, Versione = 1.2.5429.24450, Culture = neutral, PublicKeyToken = null’ non è contrassegnato come […]

Lambda è stato considerato un delegato chiuso in Visual Studio 2015

Sono rimasto sorpreso dal fatto che ci sarebbe stata una differenza di runtime tra questi due delegati ( fn1 e fn2 ): static int SomeStaticMethod(int x) { return x; } // fn1.Target == null in this case Func fn1 = SomeStaticMethod; // fn2.Target != null in this case Func fn2 = x => x; Ma […]

Rendere variabili catturate da una chiusura volatile

In che modo le variabili catturate da una chiusura interagiscono con thread diversi? Nel seguente esempio di codice vorrei dichiarare totalEvents come volatile, ma C # non lo consente. (Sì, so che questo è un codice errato, è solo un esempio) private void WaitFor10Events() { volatile int totalEvents = 0; // error CS0106: _someEventGenerator.SomeEvent += […]

Problema con i delegati in C #

Nel seguente programma, DummyMethod stampa sempre 5. Ma se usiamo il codice commentato, otteniamo valori diversi (ad esempio 1, 2, 3, 4). Qualcuno può spiegare perché questo è felice? delegate int Methodx(object obj); static int DummyMethod(int i) { Console.WriteLine(“In DummyMethod method i = ” + i); return i + 10; } static void Main(string[] args) […]

Quali sono le semantiche corrette di una chiusura su una variabile di loop?

Considera il seguente codice lua: f = {} for i = 1, 10 do f[i] = function() print(i .. ” “) end end for k = 1, 10 do f[k]() end Questo stampa i numeri da 1 a 10. In questo caso, i viene chiuso sul valore per ogni iterazione del ciclo esterno. Questo è […]

RelayCommand da lambda con parametri del costruttore

Se, in un file XAML, lego un pulsante a “Comando” dalla seguente class, quindi facendo clic sul pulsante non viene eseguito DoIt: class Thing() { public Thing(Foo p1) { Command = new RelayCommand(() => DoIt(p1)); } private DoIt(Foo p) { p.DoSomething(); } public ICommand Command { get; private set; } } Tuttavia, funziona se inizializzo […]

In chiusura, che cosa innesca una nuova istanza della variabile catturata?

Sto leggendo il C # di Jon Skeet in Profondità . Nella pagina 156 ha un esempio, Listato 5.13 “Catturare più istanze variabili con più delegati”. List list = new List(); for(int index=0; index < 5; index++;) { int counter = index*10; list.Add(delegate { Console.WriteLine(counter); counter++; } ); } foreach(ThreadStart t in list) { t(); […]