1) Строго говоря, вы не можете получить утечку памяти в C#.
Это требует некоторого объяснения:
Во-первых, предполагается, что вы имеете дело исключительно с управляемым кодом. Если вы C# подключаетесь к любому неуправляемому коду, то вы можете получить утечки памяти там, но не в самом C#. Здесь нет неуправляемого кода.
Во-вторых, программа C# может, конечно, освободить меньше памяти, чем должна, но, строго говоря, это не утечка памяти. Утечка памяти происходит, когда программа теряет все ссылки на память, но память все еще выделяется. Это не может произойти в C#. Может случиться так, что вы случайно держите ссылки, которые вам не нужны (например, заполняете ссылки в List
и не убираете те, с которыми вы закончили). Опять же, это не происходит здесь.
В-третьих, целью Dispose
является не очистка памяти, а очистка ресурсов , отличных от памяти, например, файловых дескрипторов, соединений с БД и неуправляемых ресурсов (см. Выше).
Таким образом, пропуская Dispose
, вы можете иметь утечку ресурса, но не утечку памяти.
2) Будет ли получена утечка ресурса, зависит от контекста
ReadDT
является автономным - он создает (косвенно) и располагает DataTable
и ничего не возвращает. Единственная проблема в том, что он должен иметь блок using
для вызова Dispose
, чтобы гарантировать его вызов при возникновении исключений.
Два других метода оба создают (прямо или косвенно) a DataTable
и верни это. Они правильно не Dispose
это делают, потому что если бы они это сделали, они бы возвращали удаленный объект, который не должен использоваться кем-либо.
Общее правило таково, если метод создает и возвращает одноразовый объект. объект, предполагается, что вызывающая сторона несет ответственность за ее удаление (как это сделано в ReadDT
) или за перенос ответственности на что-то другое, обычно путем возврата объекта, как это делается двумя другими методами.