Освобождение ресурсов и ошибка System.NullReferenceException - C#

Узнай цену своей работы

Формулировка задачи:

Я написал класс:
Листинг программы
  1. public class Database
Который в веду сложности создания, имеет в конструкторе ряд эксепшенов типа:
Листинг программы
  1. throw new Exception("бла бла бля");
Это один из основных модулей приложения. Но, приложение должно работать и само по себе без этого класса! В связи с этим я написал функцию которая создаёт этот класс:
Листинг программы
  1. private static Database CreateDatabase()
  2. {
  3. try
  4. {
  5. Database data = new Database();
  6. return data;
  7. }
  8. catch (Exception ex)
  9. {
  10. MessageBox.Show("Can not create database module: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
  11. return null;
  12. }
  13. }
И дабы не утруждать себя лишними конструкциями типа
Листинг программы
  1. if(database != null)
написал деструктор для своего Database, рассчитывая на то, что при успешном создании класса быдет выполнен ряд неких действий ( сохранение настроек ), а в случае не успешного создания просто ничего не произойдёт.
Листинг программы
  1. ~Database()
  2. {
  3. Settings.Database.Default.IsFree = Program.database.Free;
  4. Settings.Database.Default.Save();
  5. }
Но не тут то было, деструктор всё ровно вызывается, но для класса который не был успешно создан и ссылка на которого потерялась. Вопрос, как мне это разрешить? Эксепшен 'System.NullReferenceException' вот такой. Вылетает на строчке Settings.Database.Default.IsFree = Program.database.Free; . И это мне кажется очень странным))) Спасибо за помошь или за объяснение происходящего.

Решение задачи: «Освобождение ресурсов и ошибка System.NullReferenceException»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.IO;
  6.  
  7. namespace ConsoleApplication4
  8. {
  9.     class Program
  10.     {
  11.         static void Main(string[] args)
  12.         {
  13.             //Создаем объект
  14.             MyClass mc = new MyClass();
  15.             //Подписываемся на событие объекта
  16.             mc.myEvent += delegate(object sender, EventArgs e)
  17.             {
  18.                 Console.WriteLine("Произошло событие в объекте: {0}", sender.GetType().Name);
  19.             };
  20.             //Вызываем метод объекта и обрабатываем событие
  21.             mc.MakeEvent();
  22.             Console.ReadLine();
  23.         }
  24.     }
  25.     public class MyClass
  26.     {
  27.         //Событие
  28.         public event EventHandler myEvent;
  29.  
  30.         public MyClass() { }
  31.  
  32.         //Метод генерирующий событие в MyClass
  33.         public void MakeEvent()
  34.         {
  35.             //Проверка на наличие подписчиков на событие
  36.             if (myEvent != null)
  37.                 myEvent(this, new EventArgs());
  38.         }
  39.     }
  40. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.429 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы