黑马程序员技术交流社区

标题: 谁能说下这是什么原因呢--变量的作用域 [打印本页]

作者: HM朱百青    时间: 2013-4-9 23:02
标题: 谁能说下这是什么原因呢--变量的作用域
本帖最后由 HM朱百青 于 2013-4-16 08:18 编辑
  1. class Program
  2.     {
  3.         int i = 1;      
  4.         static void Main(string[] args)
  5.         {           
  6.             int i = 56;           
  7.             Console.WriteLine(i);
  8.             Console.ReadKey();
  9.         }
  10.     }
复制代码
不是说在同一个作用域内,变量不能声明多次吗?


作者: 张正强    时间: 2013-4-9 23:12
int i = 1; 是全局变量
int i = 56;  是局部变量

作者: 林声荣    时间: 2013-4-9 23:38
你贴出来的代码一个变量i是类中的成员变量可以作用于整个类中,而另一个i是main函数中的局部变量,只作用于main函数中、、、、
当调用Console.WriteLine(i);时访问的是main函数中的变量i
还有就是上面main函数也不能访问到定义的第一个变量i,因为它不是静态的,main是静态方法不能访问非静态成员、、


作者: 韦俊琳    时间: 2013-4-9 23:57
在这段代码中,第一个i的作用域是整个类,也就是类的字段,第二个i的声明会替代第一个i,所以该程序会输出56.

关于作用域的问题:
变量的作用域是指可以使用该变量的代码区域。
一般情况下,确定作用域有如下规则:
A、只要变量所属的类在某个作用域内,其字段(也叫做 成员变量)也在该作用域中。
B、局部变量存在于声明该变量的块语句或方法结束的大括号之前的作用域。
C、在for、 while 循环中声明的变量,只存在于该循环体内。

在变量使用中,可能产生命名冲突的情况,就像楼主这样的问题。
同样类似的问题还有:
  1. static void Main()
  2. {
  3. for(int i=0;i<10;i++)
  4. {
  5. Console.WriteLine(i);
  6. }

  7. for(int i=0;i<20;i++)
  8. {
  9. Console.WriteLine(i);
  10. }
  11. }
复制代码
上述代码中,两个循环中都使用了i ,但都可以正常输出,因为每个i的作用域都在其对应的两个循环体内。

如果是下面这种情况,就要注意了:
  1. static void Main()
  2. {
  3. int j=5;
  4. for(int i=0;i<10;i++)
  5. {
  6. int j=20;
  7. Console.WriteLine(i+j);
  8. }
  9. }
复制代码
这段代码编译就会出错,因为第一个j 在作用域是整个Main()方法,这样,其在循环体内也是有效的。于是,在循环体内定义一个同名的j时,就会报错了。


作者: HM邱刚权    时间: 2013-4-10 11:47
本帖最后由 HM邱刚权 于 2013-4-10 11:49 编辑

i=1他的声明和作用范围在整个类里面
i=56他的声明范围只在main方法里
调用Console.WriteLine(i);时访问的是main函数中的变量i

1.png (8.03 KB, 下载次数: 30)

1.png

作者: zerochen46    时间: 2013-4-11 13:31
第一个i是类变量
第二个i是局部变量,在方法中,若类变量和局部变量同名的话,局部变量会覆盖类变量,但是可以用this来访问类变量。
在你的程序中的类变量不能在static方法中调用,要想在static方法中调用类变量,类变量也要声明为static
作者: 高文咪    时间: 2013-4-11 14:14
第一个i是全局变量,作用于整个类中;
第二个i是局部变量,只作用于Main()方法中;
作者: 刘欢    时间: 2013-4-11 17:48
林声荣 发表于 2013-4-9 23:38
你贴出来的代码一个变量i是类中的成员变量可以作用于整个类中,而另一个i是main函数中的局部变量,只作用于 ...

厉害,存在静态方法




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2