Почему там не 'fieldof' или 'methodof' оператор в C#? [закрытый]

Может быть важно, что Perl никогда не отдает память к системе отдельно: это - все до malloc() и все правила, связанные с этим.

Знание, как malloc() выделяет память, важно для ответа на больший вопрос, и это варьируется от системы до системы, но в целом большинства malloc() реализации оптимизированы для выделения программ и освобождения в подобных стеку заказах. Perl использует подсчет ссылок для отслеживания памяти, что означает, что освобождение, что означает (в отличие от основанного на GC языка, который использует malloc() внизу) это - на самом деле не все, что трудный сказать, куда освобождение собирается произойти, и в какой порядок.

Может случиться так, что можно реорганизовать программу для использования в своих интересах этого факта - путем вызова undef($old_object) явно - и в правильном порядке, способом, подобным пути, C-программисты говорят free(old_object);

Для продолжительных программ (дни, месяцы, и т.д.), где у меня есть загрузки циклов загрузки/копии/дампа, я собираю "мусор" с помощью exit() and exec(), и где это otherwide невыполнимый, я просто собираю свои структуры данных (использование Storable) и дескрипторы файлов (использование $^F) и exec($0) - обычно с набором переменной среды как $ENV{EXEC_GC_MODE}, и Вам, возможно, понадобится что-то подобное, даже если у Вас нет собственных утечек просто, потому что Perl пропускает маленькие блоки что Ваша система malloc() не может выяснить, как отдать.

Конечно, если у Вас действительно есть утечки в Вашем коде, затем остальная часть моего совета несколько более релевантна. Это было первоначально отправлено на другой вопрос на этом предмете, но это явно не покрывало продолжительные программы.


Все утечки памяти программ жемчуга или будут XS, содержащим на ссылку или круговую структуру данных. Devel:: Цикл является большим инструментом для нахождения циклических ссылок, если Вы знаете, какие структуры, вероятно, будут содержать циклы. Devel:: Быстрый взгляд может использоваться для нахождения объектов с более высоким, чем ожидалось подсчетом ссылок.

Если Вы не знаете, где еще посмотреть, Devel:: LeakTrace:: Быстро могло быть хорошее первое место, но Вам будет нужен жемчуг, созданный для отладки.

Если Вы подозреваете, что утечкой является внутреннее XS-пространство, это намного более твердо, и Valgrind, вероятно, будет Вашим лучшим выбором. Тест:: Valgrind может помочь Вам понизить объем кода, который необходимо искать, но это не будет работать над Windows, таким образом, необходимо было бы портировать (по крайней мере, текучая часть) к Linux, чтобы сделать это.

43
задан Jason 31 July 2009 в 18:19
поделиться

4 ответа

Эрик Липперт (из группы разработчиков C #) имеет отличный обзор / обсуждение этой темы здесь . Цитата:

Это потрясающая функция, которую почти каждый, кто участвует в процессе проектирования, хотел бы, чтобы мы могли ее реализовать, но есть веские практические причины, по которым мы решили не делать этого. Если наступит день, когда его разработка и реализация станет лучшим способом потратить наш ограниченный бюджет, мы это сделаем. А пока используйте Reflection.

22
ответ дан 26 November 2019 в 23:01
поделиться

Я сожалею о том дне, когда размышлять стало так легко. Если вы думали, что динамический SQL - это плохо, это привело бы к чему-то в десятки раз хуже.

Представьте себе изменение имени свойства и необходимость беспокоиться об ошибках времени выполнения. / дрожь

-2
ответ дан 4 August 2019 в 08:34
поделиться

@ 280Z28 - Мы просто сели, чтобы выяснить, как это сделать, когда я нашел ваш вопрос и код. Нам нужен был метод PropertyOf, поэтому я его добавил. Вот на случай, если кому-то это понадобится. Спасибо за отличный вопрос.

     public static PropertyInfo PropertyOf<T>(Expression<Func<T>> expression)
    {
        MemberExpression body = (MemberExpression)expression.Body;
        PropertyInfo pi = body.Member as PropertyInfo;
        if (pi != null)
        {
            return pi;
        }
        else throw new ArgumentException("Lambda must be a Property.");
    } 

      [TestMethod()]
    public void MethodofPropertyOfTest<T>()
    {

        string foo = "Jamming";
        MethodInfo method1 = ReflectionHelper.Methodof(() => default(string).ToString());
        PropertyInfo prop = ReflectionHelper.PropertyOf(() => default(string).Length);
        Assert.AreEqual(method1.Invoke(foo, null), "Jamming");
        Assert.AreEqual(prop.GetGetMethod().Invoke(foo, null), foo.Length);
    }
6
ответ дан 26 November 2019 в 23:01
поделиться

Фактически можно избежать использования как отражения, так и лямбда-выражений (.NET Framework 2.0). Рассмотрим следующий класс:

public class methodof<T>
{
    private MethodInfo method;

    public methodof(T func)
    {
        Delegate del = (Delegate)(object)func;
        this.method = del.Method;
    }

    public static implicit operator methodof<T>(T methodof)
    {
        return new methodof<T>(methodof);
    }

    public static implicit operator MethodInfo(methodof<T> methodof)
    {
        return methodof.method;
    }
}

и его использование:

MethodInfo writeln = (methodof<Action>)Console.WriteLine;
MethodInfo parse = (methodof<Func<string, int>>)int.Parse;
35
ответ дан 26 November 2019 в 23:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: