【问题标题】:Declaration without state无状态声明
【发布时间】:2019-03-14 10:13:19
【问题描述】:

您好,我有简单的代码,想要一键控制标签:

private void button1_Click(object sender, EventArgs e)
{            
    bool T=true;

    if (T)
    {
        label1.Text = "GOOD";
        T=false;
    }
    else if(!T){
        label1.Text = "BAD";
        T=true;
    }
}

问题是,每次我按下按钮时,它都声明为 true,并且每次都是 true 条件。我不能这样声明

bool T;

因为收到错误:

CS0165 使用未分配的局部变量“T”WindowsFormsApp1

我怎样才能声明一次?

【问题讨论】:

  • 使用字段而不是局部变量。分配一个适合的默认值(即,决定您是否希望它默认为truefalse)。那么你可能想要label1.Text = T ? "GOOD" : "BAD"; T = !T
  • 在方法外部声明它并像在方法内部一样给它一个起始值
  • 我看不出你真正想要实现什么。一开始T 总是为真,使第一个条件allways 适合。这会将T 更改为false,使第二个条件适合(我想您想要iì f,而不是else if)。所以在我看来,两个分支都应该始终执行,使条件变得毫无意义?
  • 这段代码似乎暗示你需要更好地理解变量作用域的概念。
  • 为什么我的帖子被否决了?我只是试着学习......

标签: c# button triggers declaration


【解决方案1】:

当您想要在某个点击状态和未点击状态之间切换时,您需要在您的 中添加一个成员,而不是只存在于 方法 中的变量:

class MyClass
{
    bool foo;

    private void button1_Click(object sender, EventArgs e)
    {            
        if (this.foo)
        {
            label1.Text = "GOOD";
            this.foo=false;
        }
        else
        {
            label1.Text = "BAD";
            this.foo = true;
        }
    }
}

还请注意,我省略了 else if,因为布尔只能有两种状态:truefalse。第三种情况是没有办法的。所以所有匹配第一个条件的东西都会自动匹配第二个条件,你不需要(再次)测试布尔值。

【讨论】:

    【解决方案2】:

    如果您想将label1.TextGOOD 切换到BAD,您可以尝试一个简单的旋转运算符:

    private void button1_Click(object sender, EventArgs e)
    {            
        label1.Text = string.Equals("GOOD", label1.Text, StringComparison.OrdinalIgnoreCase)
          ? "BAD"
          : "GOOD";
    }
    

    如果您想要更详细的解决方案,让我们提取一个属性,例如:

    public bool IsGood {
      get {
        // Simplest implementation; often adding a backing field is a good idea
        return label1.Text = string
          .Equals("GOOD", label1.Text, StringComparison.OrdinalIgnoreCase);
      }
      set {
        label1.Text = value ? "GOOD" : "BAD";
      }
    }
    

    然后点击事件

     private void button1_Click(object sender, EventArgs e) {
       IsGood = !IsGood; 
     } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-06
      • 2020-06-10
      • 1970-01-01
      • 2022-12-09
      • 2018-01-12
      • 2017-03-29
      • 1970-01-01
      相关资源
      最近更新 更多