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

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

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

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

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

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
 
namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            //Создаем объект
            MyClass mc = new MyClass();
            //Подписываемся на событие объекта
            mc.myEvent += delegate(object sender, EventArgs e)
            {
                Console.WriteLine("Произошло событие в объекте: {0}", sender.GetType().Name);
            };
            //Вызываем метод объекта и обрабатываем событие
            mc.MakeEvent();
            Console.ReadLine();
        }
    }
    public class MyClass
    {
        //Событие
        public event EventHandler myEvent;
 
        public MyClass() { }
 
        //Метод генерирующий событие в MyClass
        public void MakeEvent()
        {
            //Проверка на наличие подписчиков на событие
            if (myEvent != null)
                myEvent(this, new EventArgs());
        }
    }
}

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


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

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

7   голосов , оценка 4.429 из 5
Похожие ответы