Комментарии 23
Забавные «выражения».
-3
Expression мощный инструмент, только как он с GC работает? С одной стороны, в .net нет инструментов для выгрузки неиспользуемого кода. Если подгрузил assembly, то и будет в памяти болтаться, а с другой можно динамически создавать Expression, потом их, опять же, динамически компилировать, использовать и забывать (сдавать в GC) и проблем с утечкой памяти вроде как нет.
Как это реализовано поверх MSIL 2.0 для меня осталось загадкой :)
Как это реализовано поверх MSIL 2.0 для меня осталось загадкой :)
+2
Вот такой вот код:
стабильно держится на 15 мегабайтах и не растет уже минут 10. А как сделано — тут я пас.
int s = 0; for(int i=0;i<int.MaxValue;i++) { int i1 = i; Expression<Func<int, int>> x = j => j + i1; Func<int, int> f = x.Compile(); s += f(i); if (i % 100 == 0) { Console.WriteLine(s); GC.Collect(); } } Console.WriteLine(s);
стабильно держится на 15 мегабайтах и не растет уже минут 10. А как сделано — тут я пас.
0
В Expression идет значение i1 или i1 идет как замыкание? Если как замыкание, то возможно используется кэширование.
0
Вот такое изменение вашего кода поможет вам понять, как это сделано:
Assembly [] b = AppDomain.CurrentDomain.GetAssemblies();
Console.WriteLine(«Before = » + b.Length);
int s = 0;
for (int i = 0; i < int.MaxValue; i++)
{
int i1 = i;
Expression<Func<int, int>> x = j => j + i1;
Func<int, int> f = x.Compile();
Assembly[] a = AppDomain.CurrentDomain.GetAssemblies();
Console.WriteLine(«After = » + a.Length);
s += f(i);
if (i % 100 == 0)
{
Console.WriteLine(s);
GC.Collect();
}
}
+1
Как это нету возможности? В .net есть возможность выгружать динамически код — создаете Assembly, вгружаете в нее то, что надо, отрабатывает, выгружаете весь домен
+1
Гляньте DynamicMethod тут msdn.microsoft.com/en-us/library/system.reflection.emit.dynamicmethod.aspx
+1
Хорошая техника! Аналогичный подход используется в ASP.NET MVC 2 RC (например ActionMethodDispatcher.cs)
0
Только не говорите, что это очень крутая штука для создания своего ORM =)
Кстати, кому интересно, недавно рылся в блогах MSDN и нашел некого meek'а. У него крутая статья по
деревьям выражений
Кстати, кому интересно, недавно рылся в блогах MSDN и нашел некого meek'а. У него крутая статья по
деревьям выражений
0
blogs.msdn.com/meek/archive/2008/04/25/using-linq-expressions-to-generate-dynamic-methods.aspx
Сорри клава глючит. Ссылку дал
Сорри клава глючит. Ссылку дал
0
Интересно с каких пор появился оператор methodof?
Эрик Липерт писал, что такого оператора у нас не будет даже в C# 4 — слишком дорого проектировать, тестировать, сопровождать (((
Эрик Липерт писал, что такого оператора у нас не будет даже в C# 4 — слишком дорого проектировать, тестировать, сопровождать (((
0
А смысл иметь оператор methodof? Сделайте свой статический класс хелпер со статическим методов methodof(Type type, String method_name, BindingAttributes attr) и юзайте на здоровье. Если же считаете, что оператор будет работать быстрее такого метода (типа нативная поддержка, как typeof), то возникает вопрос: зачем выигрышь в 10 микросекунд? Или Вы собираетесь миллион раз вызывать этот оператор? (что какбы редко бывает и не стоит делать)
0
Смысл — в строгой типизации. Если бы был оператор methodof, то, например, при рефакторинге я бы не заботился о том, что надо еще поменять имена функций в строковых константах. Поэтому, например, я предпочитаю использовать вот такой вот метод:
Который потом вызывается, например, так:
private static string GetMethodName<T>(Expression<Action<T>> action) { Expression body = action.Body; var mce = body as MethodCallExpression; if (mce != null) return mce.Method.Name; return null; }
Который потом вызывается, например, так:
string beginMethodName = GetMethodName<Stream>(s => s.Read(null, 0, 0));
0
ExpressionTrees — крутая штука =)
Чешутся руки что-нибудь сделать с помощью них, а работа все время отнимает…
Чешутся руки что-нибудь сделать с помощью них, а работа все время отнимает…
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Expressions в C# — impress yourself!