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 "?
哪个优先?类变量还是局部方法变量?
要在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());
}
}