C#中的变量声明和范围

时间:2014-07-28 23:39:10

标签: c# class scope

我是C#的新手,并且在变量范围方面遇到了一些麻烦。

 if(number > 10)
 {
      int someNr = 5;
 }
 else
 {
      /* .... */
 }

 if(number2 < 50)
 {
      someNr = 10; /* PRODUCES AN ERROR */
 }
 else
 {
     /* ........ */
 }

我知道如果数字不是&gt; 10然后someNr将不会被声明为int。但是我应该写两次intNr?如果两个if都是真的怎么办?双重声明?如果我在if

之外声明变量,这是一个问题吗?

类变量

PHP

class TEST {
   private $test = 'test';

   private function testVariable(){
       /* Not declared */
       echo $test;
   }

   private function testVariable2(){
       /* echo 'test' */
       echo $this->test;
   }
}

C#

class TEST {
   private string test = "test";

   private void testVariable(){
       /* takes the value of class variable test */
       test;
   }

   private function testVariable2(){
       /* takes also the value of class variable 'test' */
       this.test;
   }
}

但是如果

C#

class TEST {
   private string test = "test";

   private void testVariable(){
       string test = "somethingOther";

       Console.WriteLine(test);
   }
}

测试是&#34;测试&#34;或&#34; somethingOther&#34;?

哪个优先?类变量或本地方法变量?

3 个答案:

答案 0 :(得分:1)

您的第一个示例会产生错误,因为someNr仅在if语句的范围内定义。您必须在第二个if中重新定义它,并将其声明为int

在第二个示例中,正确的语法为Console.WriteLine(test);。您的输出将是&#39; somethingOther&#39;,因为将使用内部范围中的test

答案 1 :(得分:1)

要在if语句中设置变量,您应该在if语句之外声明它,否则它将是仅在if语句中可用的局部变量:

int someNr;
if(number > 10)
{
  someNr = 5;
}
else
{
  /* .... */
}

if(number2 < 50)
{
  someNr = 10;
}
else
{
  /* ........ */
}

注意:您还需要在else块中为变量设置一些值,或者在定义时设置初始值,否则不知道总是有值。


在你的班级TEST中,局部变量会影响班级成员:

class TEST {
  private string test = "test"; // this is a member of the class

  private void testVariable(){
    string test = "somethingOther"; // this is a local variable that shadows the class member

    Console.WriteLine(test); // this will use the local variable, it can't see the class member
  }
}

答案 2 :(得分:1)

方法范围的示例 - 变量someNr在方法中声明(以及number2),因此可以在整个方法中访问:

public class IntegersTestScope
{
    public void TestIntegers(int number)
    {
        int number2 = 0;
        int someNr = 0;

        number2 += number;

        if (number > 10)
        {
            someNr = 5;
        }
        else
        {
            /* .... */
        }

        if (number2 < 50)
        {
            someNr = 10; /* This will no longer PRODUCE AN ERROR */
        }
        else
        {
            /* ........ */
        }

        Console.WriteLine("someNr={0}", someNr.ToString());
    }
}

类范围的示例 - 变量_someNr在类中声明,因此可以被该类的所有方法访问(注意:变量_someNr以下划线为前缀字符'_'作为命名约定只表示变量全局到类,并且代码不需要工作):

public class IntegersTestScope
{
    private int _someNr = 0;

    public void TestIntegers(int number)
    {
        int number2 = 0;

        number2 += number;

        if (number > 10)
        {
            _someNr = 5;
        }
        else
        {
            /* .... */
        }

        if (number2 < 50)
        {
            _someNr = 10; /* This will no longer PRODUCE AN ERROR */
        }
        else
        {
            /* ........ */
        }

        Console.WriteLine("someNr={0}", _someNr.ToString());
    }
}