Обновить
71
Александр Фомин@Sane

Пользователь

28
Подписчики
Отправить сообщение
Тут ты не учел, что последовательность кодов тоже важно. С тем же успехом я могу выбрать последовательность 9999 9998… 0001 0000, а ее опитмизация уже отличается от твоей. А доказательство, что твоя строка лучше моей, нет.
C#, как я понимаю, первый? Тогда это не интересно…
Честно говоря, с опаской жду C# 4.0. Вроде бы, есть ку да применить его фичи, но как вспомню, что делают с Линком «неумелые» программисты, боюсь думать, что они будут делать с dynamic.
Спасибо за статью, но…
Раньше тоже страдал такими вот «выигрышами» (да и сейчас нередко)… Но после плотной работы с оптимизацие производительности, понял, что такие выигрышы ничего не стоят. Даже самый «толстый» вызов стоит микросекунды, так что бороться здесь просто не за что. А если они становятся проблемой — значит проблема где-то выше.
Имхо, создатели C# не так уж охотно вводят новые понятия (а тем более, добавляют «сахар»). Все последние нововведения — осознанная необходимость. Здесь же чистой воды «сахар».
Возможно, я погорячился. Но по крайней мере это сильно усложнит работу компилятора.
Эрик Липперт не так давно писал про yield return в анонимных методах (здесь или по-русски здесь), хотя этого и не хватает. А вот смешивание return и yield return по идее совершенно невозможно.
то, что перенся allocation в try, даже в случае hread.abort…

ой, дошло. Память уже может быть выделена, а указатель не инициализаирован.

Прошу прощения, был неправ.
Черт, не заметил что написал дважды.
Маленький пример опровергает это:
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
Try
System.Threading.ThreadAbortException
finally


В output:
try
finally

На C# подобное реализуется с помощью LambdaExpression.Compile(). (http://stackoverflow.com/questions/346523/how-do-i-compile-an-expression-tree-into-a-callable-method-c как quick-start)
Сомневаюсь, потому как весь этот функционал используется «из коробки»:
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");
			}
		}
Просто сам не так давно сталкивался с тем, что нужно было написать простенький proxy. Оказалось, в .NET такая штука уже есть.
Не холивара ради, но просвящения для — на C# такая штука пишется за две минуты, используя System.Net.HttpListener.
var f = (a,b)=>a&b невозможен в принципе в статически-типизированных языках. Не забываем, что оператор может быть перегружен и т.п. Если внутри одной функции компилятор еще хоть как-то может выяснить тип параметров, то в случае, если фуктор выходит за пределы функции, это невозможно. Поэтому функторы и не выводятся.
По моему скромному опыту, partial классы применяются очень редко. В принципе, он нужен только для автогенеренного кода — вот здесь без partial было бы очень плохо.
Хороший вопрос.
Немного оффтоп, но стало интересно. А сколько человек у вас в команде и сколько времени ушло на кодирование? 300 коммитов — это как-то нереально мало, имхо.
Ой. Совершенное число впрочем тоже вполне магическое.
28 = 1+2+4+7+14, то есть число равно сумме всех своих делителей.

Информация

В рейтинге
Не участвует
Откуда
Минская обл., Беларусь
Дата рождения
Зарегистрирован
Активность