Як змінити аргумент значення в межах обробника події?

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

Я також хочу, щоб подію (який підписано цим методом), щоб змінити його.

Робимо це:

class myCheckBox : CheckBox
{
    bool b1;
    public myCheckBox(ref bool b)
    {
        b1 = b;
        this.CheckedChanged += new EventHandler(myCheckBox_CheckedChanged);
    }

    void myCheckBox_CheckedChanged(object sender, EventArgs e)
    {
        b1 = Checked;
    }
}

не допомагає, оскільки b1 - це лише копія b.

Чи є якийсь спосіб зробити: ref b1 = ref b; ? якщо ні, як я можу це вирішити?

(Приклади пояснюють лише питання.)

1
@До того, що я намагаюсь зробити, це створити автоматичний клас прапорців, який змінить пов'язаний з ним буль.
додано Автор ispiro, джерело
Можливо, ви можете використовувати бокс для цього. Або скористайтеся повертається значенням, я вважаю його дивним, що ви намагаєтесь зробити, і ви повинні намагатися уникнути цього.
додано Автор dowhilefor, джерело

4 Відповіді

Як правило, ви передаєте аргумент обробнику вашого події, який має логічне властивість, яке може бути змінено обробником події:

public class MyEventArgs : EventArgs
{
    public bool Value { get; set; }
}

public class MyClass
{
    public void method1(ref bool b)
    {
        MyEventArgs e = new MyEventArgs()
        {
            Value = b
        };
        eventMethod(e);

        b = e.Value;
    }

    void eventMethod(MyEventArgs e)
    {
        e.Value = false;
    }
}

You may also want to take a look at the standard event handler pattern established in .NET: How to: Publish Events that Conform to .NET Framework Guidelines (C# Programming Guide)

4
додано
Див. Відредагований код.
додано Автор ispiro, джерело
Те, що ви намагаєтесь зробити, порушує принцип інкапсуляції OOP. Ви дозволяєте одному класу змінити внутрішній стан іншого класу. Ви також не проводите обробник подій до події в тому самому класі; Ви можете безпосередньо викликати свої власні методи. Більш чистий підхід полягає в тому, щоб клас, який фактично містить логічне поле, підписався на подія CheckedChanged і оновився сам.
додано Автор Joel C, джерело

Передайте клас, що містить поле, рядок, що позначає його, і збережіть їх замість b1. Потім використовуйте відображення.

See How to create a reference to a value-field

1
додано

Зробіть b1 загальнодоступним полем вашого класу.

Або приватний, який має власність із громадським геттером та громадським посередником.

0
додано

Добре, коли I скопійовано код в програмі консолі (треба було змінити на статичні функції, і, звичайно, var b1), він працює так, як ви хочете, коли викликається з Main:

bool b = true;
method1(ref b);
Console.writeLine(b1);

друкує "помилково" ....

0
додано
Що я хочу для Console.writeLine ( b ); щоб надрукувати 'false'.
додано Автор ispiro, джерело
var chat = new Chat();
var chat = new Chat();
642 учасників

Обсуждение вопросов по C# / .NET / .NET Core / .NET Standard / Azure Сообщества-организаторы: — @itkpi — @dncuug