2

我搜索了网站和谷歌,但无法找到我想要的东西。我认为这很简单,但是我对 C# 还很陌生,所以我在使用这个时遇到了一些麻烦。

基本上,我有一个 if 语句来测试我拥有的单选按钮的选择,这是在单击按钮时触发的。默认情况下,我没有任何选择,如果我忘记选择一个,我的程序会通过 MessageBox 通知我。所以本质上,在你做出选择之前,你什么都做不了。

到目前为止,我只有 3 个单选按钮,但今天我又添加了一个,以及与新单选按钮相关的更多代码,包括一个新功能。

我仍在试图找出测试radioButton的最有效的内存方法是什么。现在检查,是使用临时变量还是使用这个if语句?

if (pRKButton.Checked != true ^ hexButton.Checked != true ^ binaryButton.Checked != true)
        {
            MessageBox.Show("Choose a method of encryption.");
            return null;
        }
        else....//More Goes Here

我的主要问题是:为什么当我在 if 语句中添加一个参数时,使用独占或,像这样;

if (pRKButton.Checked != true ^ hexButton.Checked != true ^ binaryButton.Checked != true ^ md5Button.Checked != true)

该程序不会注册我单击任何单选按钮。

在这一点上,我正在考虑制作一个列表框来保存所有值并选择选项,因为列表会增长。但我对无法使用独占或超过 3 个参数的原因非常好奇。无论如何,我都不是数学家,但我很想了解更多。

4

2 回答 2

8

在我进入问题的主要部分之前,我想指出您实际上不需要在这里使用 XOR。当您有单选按钮时,只能选择零或一。当您选择一个时,同一组中的其他人将自动取消选择。因此,您可以使用||来测试是否至少选择了一个。

if (pRKButton.Checked || hexButton.Checked || binaryButton.Checked)
{
   // At least one (i.e. exactly one) is checked.
}
else
{
   // None checked.
}

要回答您问题的主要部分,您的代码将失败,因为当您选择一个按钮时,您会得到false ^ true ^ true(注意您正在测试按钮是否未选中)。这样做的结果是错误的。但是当你有四个变量时,你就有了false ^ true ^ true ^ true哪个是真的。

XOR并不像您想象的那样意味着“只有一个是真的”。A XOR B XOR C如果奇数个 A、B、C 为真,则为真。这与“完全一个”不同,因为如果 A、B 和 C 三个都为真,则为真。

请参阅以下真值表以了解具有三个输入的链式 XOR 的行为:

A 异或 B 异或 C

于 2012-07-16T20:35:24.583 回答
2

除了 Mark Byer 关于单选按钮功能的良好信息之外,您可能还担心您的代码会因为很长的 if 语句而变得很臭。

尝试使用 LINQ 来简化:

container.Controls.OfType<RadioButton>().Any<RadioButton>(r => r.Checked);

将根据选中的任何单选按钮为真或假。

于 2012-07-16T20:52:22.293 回答