Member 13462842 Ответов: 1

Где добавить подписку


namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        Account MyAccount = new Account(10000);
        subscriber Mysubscriber = new subscriber();

        public Form1()
        {
            InitializeComponent();
            MyAccount.TransactionMade += new TransactionHandler(Mysubscriber.SendNotification);
        }

       
        private void ButtonCredit(object sender, EventArgs e)
        {
            MyAccount.Credit(500);
            MessageBox.Show("your current balance is ", MyAccount.BalanceAmount.ToString());
        }
    }
}



namespace WindowsFormsApp1
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }


    public delegate void TransactionHandler(object sender, TransactionEventArgs e); // Delegate Definition
    class Account
    {
        public event TransactionHandler TransactionMade; // Event Definition

        public int BalanceAmount;

        public Account(int amount)
        {
            this.BalanceAmount = amount;

        }

        public void Debit(int debitAmount)
        {
            if (debitAmount < BalanceAmount)
            {
                BalanceAmount = BalanceAmount - debitAmount;
                TransactionEventArgs e = new TransactionEventArgs(debitAmount, "Debited");
                OnTransactionMade(e); // Debit transaction made
            }
        }

        public void Credit(int creditAmount)
        {

            BalanceAmount = BalanceAmount + creditAmount;
            TransactionEventArgs e = new TransactionEventArgs(creditAmount, "Credited");
            OnTransactionMade(e); // Credit transaction made

        }

        protected virtual void OnTransactionMade(TransactionEventArgs e)
        {
            if (TransactionMade != null)
            {
                TransactionMade(this, e); // Raise the event 
            }
        }

    }


    public class TransactionEventArgs : EventArgs
    {
        public int TranactionAmount { get; set; }
        public string TranactionType { get; set; }

        public TransactionEventArgs(int amt, string type)
        {
            TranactionAmount = amt;
            TranactionType = type;
        }
    }


    public class subscriber
    {

        public void SendNotification(object sender, TransactionEventArgs e)
        {
            //Console.WriteLine("Your Account is {0} for Rs.{1} ", e.TranactionType, e.TranactionAmount);
            MessageBox.Show(e.TranactionType);
            MessageBox.Show(e.TranactionAmount.ToString());
        }



    }
}


Что я уже пробовал:

это консольный пример, который я нашел. я пытаюсь сделать это в winform. не уверен, правильно ли я поставил позицию.
1. это хорошая практика, чтобы создать учетной записи в таком положении? внутри частичного класса Form1, или я должен поместить его в класс program Main()?

2. Хорошо ли поместить подписку на событие в форму 1()?
3. Нужно ли ставить отписку , куда при необходимости?

учебное мероприятие! Спасибо!

Iqra Ali

Где находится код для консольного приложения? Ваши вопросы неясны. Можете ли вы отредактировать свою озабоченность с немного большей ясностью?

RaviRanjanKr

Пожалуйста, будьте более конкретны, задавая вопрос.

1 Ответов

Рейтинг:
4

Thomas Nielsen - getCore

Довольно необычный вопрос.

Ну, во-первых, "форма 1" не очень хороша, всегда давайте осмысленные имена :)

1. IMO это хороший принцип с принципом "один класс, один файл", по сути, размещение каждого класса-это разные файлы, и это означает, что нет, это не очень хорошее место для определения другого класса внутри класса формы, и одинаково плохо помещать его в ваш файл Main.cs, который с точки зрения немного хуже, потому что " все "знают, что main содержит один статический класс под названием "Программа" с одним статическим методом под названием Main. В конечном счете вы, скорее всего, поместите все бизнес-объекты в отдельную библиотеку dll вдали от пользовательского интерфейса, и в этом случае будет практично организовать их на будущее с самого начала.
Если вы имеете в виду помещать члены в форму? то есть не определения, а экземпляры, то это может быть прекрасно. Однако вместо этого рассмотрите возможность использования свойства. Таким образом, вы получаете аксессоры и можете добавить свой дефолт только в том случае, если он "получает" перед назначением и в реальном потоке, который никогда не произойдет. нет причин создавать экземпляр со значением, которое никогда не будет релевантным вне разработки.

2. Да. общение из класса должно быть с помощью события, почему ваша форма должна назначить eventhandler для другого класса менее ясно, но в принципе это нормально, просто не забудьте удалить eventhandlers при уничтожении формы, если объекты должны существовать после формы или вы можете сохранить материал живым в течение очень долгого времени по ссылке.

3. Необходимо ли отказаться от подписки на события, на которые вы подписаны ? ИМО всегда! Но в конечном счете в вашем примере ваши экземпляры принадлежат форме, поэтому подписчики событий не переживут закрытия вашей формы.
Форма-это "одноразовый" объект, в .net your .Метод Dispose-это тот, который вызывается потоком сборщика мусора, если вы не сделали dispose явно. Время от времени он будет пересекать память для одноразового объекта и искать ссылки в памяти пользователя, если таковые не существуют, он вызовет dispose для объекта. Это делает его удобным местом для отмены подписки.