Статические методы, GDI +, обработка исключений, тривиальные вопросы - PullRequest
0 голосов
/ 16 февраля 2012

Я начал писать веб-приложения ASP.NET после некоторой работы с WinForms. После нескольких ошибок проб и ошибок я, наконец, осознал, насколько они различны. Хотя я знаю много продвинутых вещей о C #, я никогда не изучал тривиальные вещи, которые мне следует прежде, чем перейти к более сложным вещам, поэтому я спрашиваю здесь, потому что некоторые вопросы могут Не отвечайте через учебники, а скорее опыт разработчика, поэтому я начну:

В GDI + при работе с графикой, как правильно это сделать?

Bitmap bitmap;
Graphics g;

protected void Page_Load(object sender, EventArgs e)
{
Bitmap bitmap = new Bitmap(200,200);
Graphics g = Graphics.FromImage(bitmap);
}
public void SomeMethod()
{
g.DrawRectangle(somePen,someRectangle);
}
public void SomeOtherMethod()
{
g.DrawRectangle(someOtherPen,someOtherRectangle);
}

Пример:

Bitmap bitmap;
Graphics g;

protected void Page_Load(object sender, EventArgs e)
{
Bitmap bitmap = new Bitmap(200,200);
Graphics g = Graphics.FromImage(bitmap);
}
public void SomeMethod()
{
g.DrawRectangle(somePen,someRectangle);
}
public void SomeOtherMethod()
{
g = Graphics.FromImage(bitmap);
g.DrawRectangle(someOtherPen,someOtherRectangle);
}

Пример:

Bitmap bitmap;

protected void Page_Load(object sender, EventArgs e)
{
Bitmap bitmap = new Bitmap(200,200);
}
public void SomeMethod()
{
Graphics g = Graphics.FromImage(bitmap);
g.DrawRectangle(somePen,someRectangle);
//Dispose pens,graphics..
}
public void SomeOtherMethod()
{
Graphics g1 = Graphics.FromImage(bitmap);
g1.DrawRectangle(someOtherPen,someOtherRectangle); 
//Dispose pens,graphics..
}

О статических методах:

У меня есть несколько методов, которые не вписываются ни в один экземпляр класса, например, некоторые методы SQL, которые мне нужны в разных частях приложения:

  • Если я создам новый экземпляр класса, поместите в него все. И когда я нужен один из них, создайте новый экземпляр и вызовите метод, который мне нужен.
  • Должен ли я создать новый статический класс и просто вызвать тот, который мне нужен без создания экземпляра.

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

Static Int ID = 0;
UserA triggers some Sql method to fetch his ID into variable ID.
UserB comes to site and the ID value is UserA ID

Переменные, определенные локально в статическом методе, разделяют это поведение? Есть ли такая опасность при использовании статических методов?

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

List<string> list = new List<string>();
//List can only become null if we call some method that returns null or if we do 
list = null;

Об обработке исключений: Несколько раз я читал что-то вроде «Не перехватывать исключения, с которыми вы не можете справиться», что это значит?

Почему использование метода try / catch «просто чтобы убедиться, что приложение не зависает» внутри метода не так, как производительность?

Ответы [ 3 ]

1 голос
/ 16 февраля 2012

Только перехватывать исключения, которые вы собираетесь обработать.

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

В некоторых случаях разумно использовать попытку поймать и проглотить,но они являются исключениями ...

0 голосов
/ 16 февраля 2012

Вы используете System.Drawing в приложении asp.net.Это плохая идея, если вы не сделаете абсолютно все правильно .Его изменение в ходе многостраничных событий является особенно плохой идеей, поскольку, если возникает исключение, растровое изображение никогда не удаляется (GC рассматривает экземпляр растрового изображения как объект размером 1 КБ, в то время как он фактически занимает 20-100 МБ).

WPF также подвержен подобным ошибкам, но перед сбоем будет немного масштабироваться.По сути, если вы используете большие объекты, такие как растровые изображения и изображения, в приложении asp.net, вам нужно вручную управлять памятью, чтобы не допустить быстрого исчерпания памяти процессом.

Мой совет: используйте asp.net-safe library или соберите изменения, которые необходимо внести в растровое изображение с течением времени, в отдельную очередь команд и выполните всю обработку растрового изображения в одном выражении с помощью {} ().

0 голосов
/ 16 февраля 2012

Один джентльмен, пожалуйста ...

Проверка на ноль.Да, это.Если вы убедитесь, что ноль не возвращается.Так что, если это не так, то что произойдет.

Либо нуль является допустимым аргументом, и вы делаете что-то еще (например, ничего), либо это не то, в каком случае вы должны выбросить аргумент нульИсключение как можно ближе к проблеме.В противном случае вы получите спагетти.

...