2017-05-03 113 views
-6

我有一段代码,它具有标题中所述的一个方面。在声明之前使用但在使用之后声明的变量

public string ReplaceCC(Match m)// Replace each Regex cc match with the number of the occurrence. 
{ 
    i++;//it's used in function before declaration 
    return i.ToString() + i.ToString();  
} 

public static int i=0; 
} 

我认为我脑海中有一个编译/声明的混乱。这里的问题是什么?

+0

对于试图了解您的问题而言,这是非常草率的,请修改问题并发布与您遇到的问题相关的所有相关代码,此外,请编辑解释并将其作为真正的问题在哪里调用'ReplaceCC()'? – MethodMan

+1

变量是静态的。这意味着它是在使用之前创建的。 https://msdn.microsoft.com/en-us/library/79b3xss3.aspx – Steve

+1

@Steve即使它是一个实例变量,代码也会编译得很好(尽管它的行为会有所不同)。 – Servy

回答

0

虽然我可以感知,这是莫名其妙,你的东西是在声明它的代码的顺序。有一个在下面的代码看看:

class Program 
{ 
    public Program() 
    { 
    } 

    public void myFunc() 
    { 
     canIAccessIt = 10; 
    } 

    public int canIAccessIt = 0; 
} 

以上,在C语言背景(忽略其不存在C类部分)上面的代码中任何人都可能进入一个以为myFunc函数试图访问一个变量canIAccessIt甚至在它被宣布或进入范围之前。

C#.Net世界中的变量范围并不是那种方式。一个类级变量(又名成员变量)与对象的实例相关联,并且从创建对象到时间对象被销毁或垃圾​​收集时进入范围。

就像在上面的情况一样,人们可能会认为canIAccessIt变量可能没有成为现实,因为它在myFunc方法下被声明。这是所以不是

当我上面的代码是由C#编译器编译它成为你的* .dll文件里面写MSIL(Microsoft中间语言)这样的事情这是C#项目建设过程中的输出:

class Program 
{ 
    public int canIAccessIt; 
    public Program() 
    { 
     canIAccessIt = 0; 
    } 

    public void myFunc() 
    { 
     canIAccessIt = 10; 
    } 
} 

注意:上述MSIL代码仅供参考,以便您能理解它。 MSIL代码看起来比这更奇怪,因为它必须由CLR而不是用户或程序员来理解。

因此,对于编译器来说,全局变量在类中声明的位置并不重要。只要它在你的类的开头({)和关闭大括号(})的内部,那么它的初始化将移到你的类的构造函数中。一个类的构造函数是每当你创建一个类实例时被调用的第一个方法。它发生的那一刻你的变量就会变成现实(被初始化和初始化),并成为在范围内被myFunc方法所使用。

在你的类中,唯一与i变量不同的是它是静态的,所以它的初始化将移动你的类的静态构造函数,而不是你类的实例构造函数。您的i变量的生命周期和范围与您的类的Type实例(又名静态实例)相关联。

所以每当你初始化类第一时间能在这里打电话给你ReplaceCC方法是事件的顺序:

  1. 实例构造函数被调用。
  2. 静态构造函数被调用 - 它初始化您的静态变量i
  3. 然后你在对象实例上调用ReplaceCC方法,当我已经实例化和初始化。

你也可以看看this回答哪个秒我的想法。

0

你正在申报功能范围之外的变量,作为静态类变量:

public static int i=0; 

该变量初始化你第一次尝试使用它,在创建静态实例时。

0

你在范围外声明变量,它是一个全局变量。

例如:

public class Person 
{ 
    public Person(string name) 
    { 
     this.Name = name; 
    } 

    public string Name { get; set; } 
} 

此代码声明变量名称在人的根。

-2
public string ReplaceCC(Match m) 
{ 
    i++;//Here your adding 1 to the existing value 
    return i.ToString() + i.ToString();  
} 

public static int i=0;//Here u declared and applied value, this is declared when your class get instanciated 

请查看评论

+0

**从审核队列**:我可以请求您请您在答案中添加更多的上下文。仅有代码的答案很难理解。如果您可以在帖子中添加更多信息,它可以帮助提问者和未来的读者。 – RBT