c#中的变量声明和作用域

本文关键字:作用域 声明 变量 | 更新日期: 2023-09-27 18:15:33

我是c#新手,在变量作用域方面遇到了一些麻烦。

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

我知道如果number不> 10,那么someNr将不会被声明为int。但是我应该写两次吗?如果两个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);
   }
}

test是"test"还是" somethinggother "?

哪个优先?类变量还是局部方法变量?

c#中的变量声明和作用域

要在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
  }
}

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

在第二个示例中,正确的语法是Console.WriteLine(test);。您的输出将是' somethinggother ',因为将使用内部作用域中的test

方法作用域示例——变量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());
    }
}