Тут ты не учел, что последовательность кодов тоже важно. С тем же успехом я могу выбрать последовательность 9999 9998… 0001 0000, а ее опитмизация уже отличается от твоей. А доказательство, что твоя строка лучше моей, нет.
Честно говоря, с опаской жду C# 4.0. Вроде бы, есть ку да применить его фичи, но как вспомню, что делают с Линком «неумелые» программисты, боюсь думать, что они будут делать с dynamic.
Спасибо за статью, но…
Раньше тоже страдал такими вот «выигрышами» (да и сейчас нередко)… Но после плотной работы с оптимизацие производительности, понял, что такие выигрышы ничего не стоят. Даже самый «толстый» вызов стоит микросекунды, так что бороться здесь просто не за что. А если они становятся проблемой — значит проблема где-то выше.
Имхо, создатели C# не так уж охотно вводят новые понятия (а тем более, добавляют «сахар»). Все последние нововведения — осознанная необходимость. Здесь же чистой воды «сахар».
Эрик Липперт не так давно писал про yield return в анонимных методах (здесь или по-русски здесь), хотя этого и не хватает. А вот смешивание return и yield return по идее совершенно невозможно.
На C# подобное реализуется с помощью LambdaExpression.Compile(). (http://stackoverflow.com/questions/346523/how-do-i-compile-an-expression-tree-into-a-callable-method-c как quick-start)
var f = (a,b)=>a&b невозможен в принципе в статически-типизированных языках. Не забываем, что оператор может быть перегружен и т.п. Если внутри одной функции компилятор еще хоть как-то может выяснить тип параметров, то в случае, если фуктор выходит за пределы функции, это невозможно. Поэтому функторы и не выводятся.
По моему скромному опыту, partial классы применяются очень редко. В принципе, он нужен только для автогенеренного кода — вот здесь без partial было бы очень плохо.
Немного оффтоп, но стало интересно. А сколько человек у вас в команде и сколько времени ушло на кодирование? 300 коммитов — это как-то нереально мало, имхо.
Раньше тоже страдал такими вот «выигрышами» (да и сейчас нередко)… Но после плотной работы с оптимизацие производительности, понял, что такие выигрышы ничего не стоят. Даже самый «толстый» вызов стоит микросекунды, так что бороться здесь просто не за что. А если они становятся проблемой — значит проблема где-то выше.
ой, дошло. Память уже может быть выделена, а указатель не инициализаирован.
Прошу прощения, был неправ.
static void Main(string[] args) { Thread thr = new Thread(Start); thr.Start(); Thread.Sleep(100); thr.Abort(); Thread.Sleep(1000); } static void Start() { try { Console.WriteLine("Try"); Thread.Sleep(1000); } catch(Exception e) { Console.WriteLine(e.GetType()); } finally { Console.WriteLine("finally"); } }В output
В output:
using System; using System.IO; using System.Net; namespace ConsoleApplication7 { class Program { private static HttpListener _listener; static void Main(string[] args) { _listener = new HttpListener(); _listener.Prefixes.Add("http://localhost:88/"); _listener.Start(); while (true) { IAsyncResult asyncResult = _listener.BeginGetContext(Callback, null); asyncResult.AsyncWaitHandle.WaitOne(); } } private static void Callback(IAsyncResult ar) { HttpListenerContext context = _listener.EndGetContext(ar); using(var sw = new StreamWriter(context.Response.OutputStream)) { sw.WriteLine("hello world"); } }