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. […]
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 […]
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, […]
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 […]
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 […]
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 += […]
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) […]
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 è […]
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 […]
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(); […]