【问题标题】:If statements in methods方法中的 if 语句
【发布时间】:2013-11-24 21:11:06
【问题描述】:

我在 C# 中设置了一个变量,该变量会根据选择的 If 语句而变化。

但是当我尝试 Console.WriteLine 变量时,它告诉我 变量在当前上下文中不存在,有人可以帮我解决这个问题吗?

public void mood()
{
  var unhappiness = Hunger + Boredom;

  if (unhappiness < 5)
  {
    string m = "Happy";
  }

  if (unhappiness <= 5 && unhappiness <= 10)
  {
    string m = "Okay";
  }

  if (unhappiness <= 11 && unhappiness <= 15)
  {
    string m = "Frustrated";
  }

  if (unhappiness <= 16)
  {
    string m = "Mad";
  }

  Console.WriteLine(m);
}

变量“m”是我遇到的问题。

【问题讨论】:

  • 将字符串 m 移动到方法的顶部,并从 ifs 中删除单词字符串。
  • 您还有其他问题。假设 m 的范围是固定的,这将对所有 16 的值返回 Happy。
  • 好消息@ChrisCudmore :)
  • 您可以使用if, else if 来解决@ChrisCudmore 提到的问题。

标签: c# variables if-statement scope


【解决方案1】:

您需要在外部声明字符串 m - 在您的方法声明之后:

public string mood()
        {
            var unhappiness = Hunger + Boredom;
            string m = string.Empty;
            if (unhappiness < 5)
            {
                m = "Happy";
            }

            if (unhappiness <= 5 && 
                unhappiness <= 10)
            {
                m = "Okay";
            }

            if (unhappiness <= 11 &&
                unhappiness <= 15)
            {
                m = "Frustrated";
            }

            if (unhappiness <= 16)
            {
                m = "Mad";
            }
            return m;

【讨论】:

  • 只是一个细节,但是从 void 方法返回一个字符串是行不通的;)
【解决方案2】:

这个:

{

}

将您的变量放在该范围内,因此在该范围之外将无法使用。这就是为什么您可以像刚才一样声明 4 个名为 m 的变量。每个m 在它的小括号世界里都是不同的人。

我想你可能想事先声明一下:

string m="";

if (unhappiness < 5)
{
    m = "Happy";
}

if (unhappiness <= 5 && 
    unhappiness <= 10)
{
    m = "Okay";
}

if (unhappiness <= 11 &&
   unhappiness <= 15)
{
    m = "Frustrated";
}

if (unhappiness <= 16)
{
    m = "Mad";
}

【讨论】:

  • 试图了解 c# 范围。看起来这里发生的事情是,如果在块的顶部声明了一个变量,然后在嵌套块内进行了赋值,则赋值将在内部块之外持续存在。换句话说,要隐藏内部块中的变量,我必须在该块中重新声明它。正确的?否则变量仍会引用父实例。
【解决方案3】:

正如写的那样,变量m 只存在于每个if 语句的范围内。

你应该在方法的全局范围内声明m

 public void mood()
 {
      string m = "default mood";
      // ...
 }

这将使其可用于所有子作用域(由大括号分隔),包括每个 if 语句。

在您最初编写的代码中,每次您在不同的范围内编写string m 时,您都在声明一个名为m 的新变量。每次到达作用域的末尾时,该变量都会被销毁。所以当你看到WriteLine 语句时,m 实际上并不存在。

【讨论】:

    【解决方案4】:
          public void mood()
        {
            var unhappiness = Hunger + Boredom;
            string m;
            if (unhappiness < 5)
            {
                m = "Happy";
            }
    
            if (unhappiness <= 5 && 
                unhappiness <= 10)
            {
                m = "Okay";
            }
    
            if (unhappiness <= 11 &&
                unhappiness <= 15)
            {
                m = "Frustrated";
            }
    
            if (unhappiness <= 16)
            {
                m = "Mad";
            }
    
            Console.WriteLine(m);
    

    【讨论】:

      【解决方案5】:

      在 if 语句之前定义字符串 M。 如果您在 var unhappiness 之后对其进行初始化,并将其设置在 if 语句中。 你在 if 语句中定义了字符串 m,但是当它们结束时,字符串 m 也消失了。

      【讨论】:

        【解决方案6】:

        试试这个:

        public void mood()
        {
            var unhappiness = Hunger + Boredom;
        
            string m = string.Empty;
        
            if (unhappiness < 5)
            {
                m = "Happy";
            }
        
            if (unhappiness >= 6 && unhappiness <= 10)
            {
                m = "Okay";
            }
        
            if (unhappiness >= 11 && unhappiness <= 15)
            {
                m = "Frustrated";
            }
        
            if (unhappiness >= 16)
            {
                m = "Mad";
            }
        
            Console.WriteLine(m);
        }
        

        问题在于 m 是在 if 语句中定义的,它的范围仅限于该语句。

        【讨论】:

          【解决方案7】:

          string m 被定义在 inside 你的 if 子句中。另外,你不能从你的方法中返回一个字符串,所以我改变了它:)

          试试

          public string mood()
          {
              var unhappiness = Hunger + Boredom;
              string m = string.Empty;
          
              if (unhappiness < 5)
              {
                  m = "Happy";
              }
          
                  // etc
          
              return m;
          }
          

          【讨论】:

            【解决方案8】:

            m 不存在。这就是为什么你不能把它打印出来或用它做任何事情。它不存在。没有m这样的变量。

            在一些内部作用域中,碰巧有几个变量被称为m。但只要定义它们的块退出,它们就消失了。现在他们属于一个无法返回的过去。他们的记忆像垃圾收集海洋中的水滴一样飘散了。

            【讨论】:

              【解决方案9】:

              要解决您的问题,您可以执行以下操作:

              public void mood()
              {
                var unhappiness = Hunger + Boredom;
                string m = "Unknown";
              
                if (unhappiness < 5)
                {
                  m = "Happy";
                }    
                else if (unhappiness >= 5 && unhappiness <= 10) // >= 5 not <= 5
                {
                  m = "Okay";
                }
                else if (unhappiness > 11 && unhappiness <= 15) // > 10 or >= 11 not <= 11
                {
                  m = "Frustrated";
                }
                else if (unhappiness >= 16) // assume it should be enything else
                {
                  m = "Mad";
                }
              
                Console.WriteLine(m);
              }
              
              • 变量的定义和变量的使用必须发生在用大括号 { } 定义的同一范围内。
                因此,在这种情况下,您可以在整个方法语气中使用 m,但不能在方法语气之外使用。
              • if, else if 派上用场,如果您想先检查某些内容,并且只有当结果为 false 时,您才想检查其他内容作为后备。

              【讨论】:

                猜你喜欢
                • 2011-12-01
                • 2015-06-08
                • 2019-11-15
                • 1970-01-01
                • 2013-04-20
                • 1970-01-01
                • 1970-01-01
                • 2010-12-09
                • 2013-10-24
                相关资源
                最近更新 更多