Priya-Kiko Ответов: 1

Нужна помощь с dispose() в C#


В приведенном ниже коде, пожалуйста, предложите ссылки, которые мы используем, и особенно там, где мы используем ключевое слово " new "для SqlCommand и т. д., должны ли мы явно избавляться от ссылок или заключать их в" using ()", или он будет собирать мусор, когда потеряет область действия.

private static Boolean clsinit()
{
    Boolean mret = true;
    String mconnstr = @"Data Source=PL\clsSQL,7000;Initial Catalog=clsms;User
    ID=1111;password=2222;";
    clsmain.clsconn = new SqlConnection(mconnstr);
    try
    {
        clsmain.clsconn.Open();
        SqlCommand msqlcmd = new SqlCommand("select licdate from customer",
        clsmain.clsconn);
        SqlDataReader msqldat = msqlcmd.ExecuteReader();
        msqldat.Read();
        if (DateTime.Now.Date > Convert.ToDateTime(msqldat["licdate"]).Date)
        {
            MessageBox.Show("Authentication Restricted.");
            mret = false;
        }
        else
        {
            clsmain.clsconn.Close();
            if (!pychk())
            {
                MessageBox.Show("Authentication Failed");
                mret = false;
            }
        }
    }
    catch
    {
        clsmain.oclsmsgmgr.showmsg("Error connecting Server...!|.",
        mret = false;
    }
    finally
    {
        clsmain.clsconn.Close();
    }
    loadcls mfrm = new loadcls();
    mfrm.ShowDialog();
    return mret;
}


Обратите внимание: мне дали задание выяснить некоторые утечки памяти в проекте. Пожалуйста, пролейте немного света на "манекенщицкий" язык сбора мусора. Я совершенно новичок в операциях .NET GC.

Заранее спасибо.

Что я уже пробовал:

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

1 Ответов

Рейтинг:
1

Bernhard Hiller

Это действительно грязный код со всем этим статическим и глобальным дерьмом.
Мое впечатление от этого фрагмента состоит в том, что вы запускаете в нем свое приложение со строкой mfrm.ShowDialog();- я прав? Поскольку все те одноразовые типы, о которых вы говорили, находятся в одной и той же функции, это зависит от возможностей компилятора, чтобы узнать, что они вышли за пределы области видимости. С различными функциями это легко: когда функция оставлена, локальные переменные выходят за пределы области видимости. Я не исключаю, что они собирают мусор даже здесь, но и предполагать этого не буду.
С другой стороны, утечки памяти функции, вызываемой только один раз, довольно неуместны. Ищите места, которые вызываются неоднократно - небольшие утечки памяти там могут суммироваться до соответствующих сумм.


Priya-Kiko

Хотя довольно обидно, Спасибо за ответ.

Извините, мы не такие профессионалы, как вы все, и просто занимаемся некоторыми исследованиями и разработками в процессе самообучения.

Этот фрагмент кода является частью библиотеки классов, ссылки на которую я хочу получить из других форм и других библиотек DLL, как --- class.reference = something. ---- Вот на что я наткнулся, когда читал.

Более того, sqlcommand используется в нескольких местах в нескольких функциях. В принципе, мне нужно немного пролить свет на то, как реализовать шаблон dispose.

Мне нужно немного света на это пожалуйста :

1. кажется, что переменная теряет область действия, когда она оставляет блок. Теперь я понял, что это нормально с Int или строкой, но не с SqlCommand или SqlDataReader и т. д.,
2. Теперь эти неуправляемые ресурсы, как они называются, должны быть обработаны для утилизации.
3.нецелесообразно иметь строку ref.Dispose там, где когда-либо используются такие ссылки, учитывая мой недостаток знаний о том, какие ресурсы являются неуправляемыми, а какие нет.
4. На этом фоне я понял вот что.. Dispose pattern и GC и т. д., которые я не знаю, как реализовать в своем проекте.
5. должен ли я реализовать каждый класс моего проекта из IDisposable и добавить метод Dispose (). Если это так, то я должен отслеживать все ссылки, используемые в модуле, чтобы избавиться от них здесь, не так ли?

Или просто Form.Close или вызов деструктора класса не может выполнить эту работу ?


Правильно ли я это понимаю? Пожалуйста, предложите.