A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 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.     }
复制代码
不是说在同一个作用域内,变量不能声明多次吗?

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

7 个回复

倒序浏览
int i = 1; 是全局变量
int i = 56;  是局部变量

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
你贴出来的代码一个变量i是类中的成员变量可以作用于整个类中,而另一个i是main函数中的局部变量,只作用于main函数中、、、、
当调用Console.WriteLine(i);时访问的是main函数中的变量i
还有就是上面main函数也不能访问到定义的第一个变量i,因为它不是静态的,main是静态方法不能访问非静态成员、、

点评

最后一行是正解  发表于 2013-4-11 23:12
正解~~~~~~~~  发表于 2013-4-10 07:58

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
在这段代码中,第一个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时,就会报错了。

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 HM邱刚权 于 2013-4-10 11:49 编辑

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

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

1.png

点评

你这个图容易产生误解,main函数不能调用外面的i=1的i  发表于 2013-4-11 23:13

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
第一个i是类变量
第二个i是局部变量,在方法中,若类变量和局部变量同名的话,局部变量会覆盖类变量,但是可以用this来访问类变量。
在你的程序中的类变量不能在static方法中调用,要想在static方法中调用类变量,类变量也要声明为static

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
第一个i是全局变量,作用于整个类中;
第二个i是局部变量,只作用于Main()方法中;
回复 使用道具 举报
刘欢 中级黑马 2013-4-11 17:48:13
8#
林声荣 发表于 2013-4-9 23:38
你贴出来的代码一个变量i是类中的成员变量可以作用于整个类中,而另一个i是main函数中的局部变量,只作用于 ...

厉害,存在静态方法
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马