局部变量的作用域冲突:(同名的局部变量不能在同一作用域内申明两次)
例如:
1 using System; 2 namespace MyTest.ProCSharp 3 { 4 public class ScopeTest 5 { 6 public static int Main() 7 { 8 int j=20; 9 for(int i=0;i<10;i++) 10 { 11 int j=30; 12 Console.WriteLine(i+j); 13 } 14 return 0; 15 } 16 } 17 }
解析:
第一个整形变量j在for循环体开始前定义的,其作用域在于Main内
第二个整形变量j的作用域在循环体内,同时该循环体也在方法体Main的作用域内
因为编译器无法识别区分整形变量j,所以不允许声明第二个整形变量j
例如:
1 using System; 2 namespace MyTest.ProCSharp 3 { 4 public class ScopeTest 5 { 6 public static int Main() 7 { 8 for(int i=0;i<10;i++) 9 { 10 Console.WriteLine(i); 11 } 12 for(int i=9;i>=10;i--) 13 { 14 Console.WriteLine(i); 15 } 16 return 0; 17 } 18 } 19 }
解析:
因为整型i在这里对于各自的循环体来说是局部变量,作用域在各自循环体内而不是Main方法中(就近原则)
所以这里允许同时申明整型变量i,不存在作用域冲突
字段和局部变量的作用域冲突:
例如:
1 using System; 2 namespace Wrow 3 { 4 class ScopeTest 5 { 6 static int j=20; 7 public static void Main() 8 { 9 int j=30; 10 Console.WriteLine(j); 11 return; 12 } 13 } 14 }
解析:
为什么在同一个作用域类中同时声明了相同名字的整形变量j不会报错呢?
因为C#把类型级别声明的整形变量j看作了字段,而把Main方法中声明的变量看作局部变量了
所以虽然在同一个类中声明变量,但是在Main方法中声明的新变量j隐藏了同名的类级变量j
最终输出30而不是20。
那么怎么去调用类级变量(字段)j呢?
如果调用的是静态字段:
=>ScopeTest.j(类名称.静态字段)
如果调用的是实例字段:
=>
ScopeTest scopeTest=new ScopeTest();
scopeTest.j(类的对象.实例字段)
如果在类中任意方法调用:
=>this.j(this关键字+字段名)