1

我经常遇到这个问题,我并不真正了解如何将用户表单变量传递到类中。例如我有一个按钮:

private void button1_Click(object sender, EventArgs e)
{
    DoStuff();
}

和表单类中的一个方法:

DoStuff()
{

    Class123 myclass = new Class123();

}


...
...

class Class123
{

    //how do i pass for example in myotherClass whether or not my checkbox on the userform is checked? i dont want to have to pass from method to method to class to class. what is the logical/smart way of handling this?
    ClassData myotherClass = new ClassData();
}

例如,我如何在 myotherClass 中传递我的用户表单上的复选框是否被选中?我不想必须从方法传递到方法到类到类。处理此问题的逻辑/智能方式是什么?

4

3 回答 3

3

我认为您正在寻找函数参数

// notice the declared function argument isMyCheckboxChecked
DoStuff(bool isMyCheckboxChecked)
{
    Class123 myclass = new Class123(isMyCheckboxChecked);

}

private void button1_Click(object sender, EventArgs e)
{
    // passing the state of the checkbox to DoStuff as an argument
    DoStuff(chkMyCheckbox.Checked);
}


class Class123
{
     readonly ClassData myotherClass = new ClassData();

     Class123(bool isMyCheckboxChecked) 
     { 
          myOtherClass.isMyCheckboxChecked = isMyCheckboxChecked;
     }
}
于 2012-04-05T23:12:11.987 回答
2

我可以在这里看到一些东西。发布的代码相当模糊,因此很难说正确的答案可能是什么。

  1. 如果 myOtherClass 需要知道复选框更改时是否选中了复选框,那么您可能应该考虑使用订阅者模式。

  2. 但是,如果您的意思是您只需要知道在 DoStuff() 运行时是否选中了复选框,那么传递变量并没有错。事实上,传递一个变量是首选的方式——这就是变量存在的目的。也就是说,您需要智能地传递变量;如果你发现你只是不断地在类之间传递参数,那就是代码设计不佳的标志。如果您需要将一些参数传递给 myClass 以告诉它要做什么,请将它们构建到它们自己的(描述性命名的)类中,并将该类传递给 myClass 的构造函数,而不是传递一长串参数。

于 2012-04-05T23:15:49.820 回答
1

我不同意这种做法。
任何“智能”方法,即使存在,也将打破面向对象编程的黄金法则。对象是只能以受控方式访问或更改的自包含数据项。这可以防止副作用,这是程序代码中的一个常见问题,其中数据是全局可访问的。在 OOP 中,对象只能通过调用它们的方法来接收或发送消息给其他对象。

编辑:展示一种方法

public static class MyApp
{
    public static bool MyCheckBox {get; set;}
}

在你的 doStuff 中

MyApp.MyCheckBox = this.checkBox1.Checked;

在您的 myOtherClass 的方法中

   if(MyApp.MyCheckBox == true)
   ...

这与在过去的过程语言中使用全局变量相同。这为难以跟踪的错误铺平了道路,并创建了使应用程序难以维护的状态模式

于 2012-04-05T22:55:43.813 回答