关于C#局部变量范围的问题

时间:2010-10-11 14:59:03

标签: c# variables scope

我只是想知道,我以为我不能拥有同名的变量:

int Test;
public void A(int Test)
{

}

为什么这会编译?我知道我可以使用这个关键字,但我觉得很奇怪,因为该方法在类的范围内,它允许我声明具有相同名称的变量。

8 个答案:

答案 0 :(得分:11)

int Test;不是变量,而是字段。局部变量可以与字段具有相同的名称。如果您引用name,则局部变量具有首选项。如果您想引用字段,请使用this.

答案 1 :(得分:8)

这些变量有不同的名称!

第一个变量的完整名称实际上是MyType.Test,而第二个变量(函数参数)只是Test

答案 2 :(得分:4)

根据C#语言规范,第3.7节 - 范围

  

名称的范围是。的区域   它所在的程序文本   可以引用该实体   没有通过名称声明   名称的资格。范围可以   嵌套,内部范围可以   重新声明一个名字的含义   外部范围(这不是,   但是,取消限制   由嵌套的§3.3强加的   阻止它是不可能声明一个   与a同名的局部变量   封闭块中的局部变量)。   然后是外部范围的名称   据说隐藏在该地区   程序文本由内部覆盖   范围,以及对外部名称的访问权限   只有通过限定名称才能实现。

答案 3 :(得分:1)

你可以在课堂上 Shadow 那个测试字段。 基本上,仅当已在当前范围内对同名的 本地 变量进行了声明时,才能重新声明变量。但在你的情况下,一个具有类范围和另一个方法范围。

答案 4 :(得分:1)

由于您未在此代码示例中访问Test变量,因此可以执行此操作。您必须在A方法中引用类变量Test作为this.Test来消除歧义。一般来说,你不应该这样做,这是不好的风格。建议的编码风格是成员变量应该以_开头,所以现在你的代码应该是:

int _Test;
public void A(int Test)
{
}

答案 5 :(得分:1)

你可以。成员变量(方法外部)必须在方法本身的范围内称为this.Test。在方法内部,Test将引用参数。

答案 6 :(得分:1)

你可以在很多情况下隐藏更广泛的范围(但不像在其他一些C风格的语言中那样自由),当然可以有一个同名的字段和参数(或字段和本地)

首先,如果我们不允许范围隐藏更广泛的范围,通常使用的词语很快就会被更广泛的范围所禁止。

另一方面,我们可以在更广泛的范围内引入一些内容,甚至可以从另一个程序集引入。假设您上面没有int Test;。现在想象一下,这是在一个源自另一个的类中,并且有人添加public int Test;。为解决这个问题意味着什么。

避免这样的名称冲突当然是一个好主意,并且惯例可以提供帮助(本地人的小写启动,非私人成员的大写启动,私人的下划线开始有利于抱怨非如果您在实验中暂时将私人成员公开并忘记将其设置为公开,则CLR兼容下划线,但完全禁止它将是不可行的。

答案 7 :(得分:1)

scope, declaration space, and lifetime之间,C#开发人员经常会感到困惑。

C#语言特别允许您描述的案例使方法体与方法体具有不同的声明空间。这允许例如:

的情况
class Foo
{
   private string name;
   public Foo( string name )
   {
       this.name = name;
   }
}

为参数name选择更好的名称需要开发人员采用命名约定(有些人会这样做)。术语 scope 指的是程序文本的区域,您可以通过它的非限定名称来引用构造。 重要的是要意识到范围可能会重叠 - 这就是这种情况。