Последствия создания переменной класса несколько раз в членах в C # - PullRequest
0 голосов
/ 19 января 2012

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

Это в бизнес-правиле веб-службы.

public class MyClass
{
 StringBuilder strBuild = new StringBuilder();
 SQLText sqlQry = new SQLText();
 ...

 public myMethod1()
 {
   strBuild = new StringBuilder();
   sqlQry = new SQLText();
   ...
 }

 private myMethod2()
 {
   strBuild = new StringBuilder();
   sqlQry = new SQLText();
   ...
 }

 ...
}

Если бы я писал это, я быне создавайте переменные класса, а просто создайте локальные переменные для типов StringBuilder и SQLText в каждом методе, который мне нужен.Вышеупомянутое кажется плохим программированием, потому что оно по существу создает глобальную переменную, которую нужно помнить, чтобы создать экземпляр в каждом методе или повторно создать его («очистить»).

Но наносит ли приведенный выше код реальный вред?

  1. Как с этим справляется сборщик мусора?Если переменная класса создается 30 раз в разных методах, потеряет ли она первоначальные объявления и не освободит ли память или все же в конечном итоге будет очищена?

  2. А как насчет производительности?Быстрее ли использовать одну и ту же переменную (ы) класса, как это, в куче разных методов или создать локальную переменную в соответствующих методах?

1 Ответ

3 голосов
/ 19 января 2012

Но наносит ли приведенный выше код реальный вред?

Да - это портит состояние класса. Похоже, этот класс не должен действительно иметь какое-либо состояние - это должны быть локальные переменные. Однако для случайного наблюдателя это выглядит как реальное состояние, связанное с объектом.

1) Как с этим справляется сборщик мусора? Если переменная класса создается 30 раз в разных методах, она потеряет отслеживание начальных объявлений и не сможет освободить память или все равно будет очищена?

Переменные экземпляра не "создаются" - они просто назначаются. И как только предыдущее значение было перезаписано, если ничто иное не ссылается на объект, на который ссылалось старое значение, этот объект будет иметь право на сборку мусора. Никакого вреда нет.

2) А как насчет производительности? Быстрее ли использовать одну и ту же переменную (ы) класса, как это, в куче разных методов или создать локальную переменную в соответствующих методах?

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

Просто измените их на локальные переменные - очистите проект.

...