关于C#变量作用域的一个问题
a:boolistrue=true;if(istrue==true){index=100;}与a:if(true){index=100;}的区别在学变量作用域的时候偶然发...
a:bool istrue = true;if (istrue==true) {index = 100;}与a:if(true) {index = 100;}的区别
在学变量作用域的时候偶然发现的,先定义一个局部变量index,然后在判断体内初始化,a情况index在判断体外初始化的值会丢失而B情况则不会丢失初始化的值
一下是源代码
int index;
// bool istrue = true;
if (true) {
index = 100;
}
Console.WriteLine(index);
Console.ReadKey();
看来诸位还不清楚我这个问题
那就再补充一下
int index;
bool istrue=true;
if(true){
index = 100;
}
Console.WriteLine(index);
Console.ReadKey();
以上代码是可以运行的
但是以下代码是不可以运行的,错误是使用了未赋值的局部变量“index”
int index;
bool istrue=true;
if(istrue){
index = 100;
}
Console.WriteLine(index);
Console.ReadKey();
这两段代码的区别在于if的条件不同
按正常的情况下,在if块里面初始化的变量,其值的作用域仅限于if块内,换句话说就是在if块以外该变量仍是未初始化的
但是if的条件绝对为真的情况下(if(true)),即使变量是在if块里面初始化,在if块外面初始化依然仍然不会消失
我开始时认为会不会是,如果(if(true))的话,编译器就会忽略if块,把块里面的语句当成外部语句执行,但是后来发现还是不对,我在if块(if(true))内定义了一个变量,外部依然访问不到,所以我想问一下这到底是什么机制 展开
在学变量作用域的时候偶然发现的,先定义一个局部变量index,然后在判断体内初始化,a情况index在判断体外初始化的值会丢失而B情况则不会丢失初始化的值
一下是源代码
int index;
// bool istrue = true;
if (true) {
index = 100;
}
Console.WriteLine(index);
Console.ReadKey();
看来诸位还不清楚我这个问题
那就再补充一下
int index;
bool istrue=true;
if(true){
index = 100;
}
Console.WriteLine(index);
Console.ReadKey();
以上代码是可以运行的
但是以下代码是不可以运行的,错误是使用了未赋值的局部变量“index”
int index;
bool istrue=true;
if(istrue){
index = 100;
}
Console.WriteLine(index);
Console.ReadKey();
这两段代码的区别在于if的条件不同
按正常的情况下,在if块里面初始化的变量,其值的作用域仅限于if块内,换句话说就是在if块以外该变量仍是未初始化的
但是if的条件绝对为真的情况下(if(true)),即使变量是在if块里面初始化,在if块外面初始化依然仍然不会消失
我开始时认为会不会是,如果(if(true))的话,编译器就会忽略if块,把块里面的语句当成外部语句执行,但是后来发现还是不对,我在if块(if(true))内定义了一个变量,外部依然访问不到,所以我想问一下这到底是什么机制 展开
3个回答
展开全部
确实是个问题。挺有洞察力的。
下面是我的看法:
你的代码可能是:
A情况:
int index;
bool istrue = true;
if(istrue)
{
index=100;
}
Console.WriteLine(index);
Console.ReadKey();
B情况:
int index;
if(true)
{
index=100;
}
Console.WriteLine(index);
Console.ReadKey();
问题在于:
A情况if 判断不完全(缺少else),
变量 bool istrue可能为false 而不能进入if模块体内
使Int index 可能未赋值,一般会编译报错。
B情况if判断语句为永真;故顺利通过内部初始化。
改一下:
A情况:
int index;
bool istrue = true;
if (istrue == true)
{
index = 100;
}
else
{
index = 22;
}
这是一个算法严密正确与否的问题。
也可以理解为编译器强大无漏洞的表现。
下面是我的看法:
你的代码可能是:
A情况:
int index;
bool istrue = true;
if(istrue)
{
index=100;
}
Console.WriteLine(index);
Console.ReadKey();
B情况:
int index;
if(true)
{
index=100;
}
Console.WriteLine(index);
Console.ReadKey();
问题在于:
A情况if 判断不完全(缺少else),
变量 bool istrue可能为false 而不能进入if模块体内
使Int index 可能未赋值,一般会编译报错。
B情况if判断语句为永真;故顺利通过内部初始化。
改一下:
A情况:
int index;
bool istrue = true;
if (istrue == true)
{
index = 100;
}
else
{
index = 22;
}
这是一个算法严密正确与否的问题。
也可以理解为编译器强大无漏洞的表现。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询