可变cfr的范围。多视距C#试验

可变cfr的范围。多视距C#试验,c#,scope,C#,Scope,我正在准备关于c#70-483的微软考试,“还有很长的路要走” 沿着pluralsight上的C#路径。 在做了测试并复习了我的错误答案后,我得出了这个答案 2.考虑以下代码: static void ListTowns(string[] countries) { foreach (string country in countries) { int townCount = GetTownCount(country); int i = 0;

我正在准备关于c#70-483的微软考试,“还有很长的路要走” 沿着pluralsight上的C#路径。 在做了测试并复习了我的错误答案后,我得出了这个答案

2.考虑以下代码:

static void ListTowns(string[] countries)
 {
    foreach (string country in countries)
    {
        int townCount = GetTownCount(country);
        int i = 0;
        for (i = 0; i < townCount; i++)
        {
            Console.WriteLine(GetTownName(country, i));
        }
    } 
}
静态无效列表城镇(字符串[]国家)
{
foreach(国家中的字符串国家)
{
int townCount=GetTownCount(国家);
int i=0;
对于(i=0;i

变量i何时超出范围? 答复:

  • 退出
    ListTowns()
    方法时

  • 退出
    foreach循环时

  • 我从不超出范围,因为方法是静态的

  • 退出循环的

  • 正确答案是4,但我的答案是2。 因为在for循环之后,u仍然可以使用i。
    还是我对“超出范围”的定义不正确?

    您的答案2是正确的

    我在VisualStudio中使用了以下代码

    class Program
    {
        static void Main(string[] args)
        {
             string[] testdata = { "one", "two", "three", "four"};
             ListCheckFunction(testdata);
             Console.ReadLine();
        }
    
        static void ListCheckFunction(string[] countries)
        {
            foreach (string country in countries)
            {
                int townCount = countries.Count();
                int i = 0;
                for (i = 0; i < townCount; i++)
                {
                    Console.WriteLine(country + " " +i);
                }
                Console.WriteLine(i + " i is still in scope");
            }
        }
    }
    

    在我看来,这个问题很模糊,措辞也很糟糕。在C#中没有变量“超出范围”这样的概念,但变量的范围是存在的,
    i
    变量的范围是整个
    foreach
    循环体,包括
    for
    循环的右大括号和
    foreach
    循环的右大括号之间的空语句集。C#5规范的相关部分为3.7:

    局部变量声明(§8.5.1)中声明的局部变量的范围是声明发生的块。在这种情况下,该块是
    foreach
    循环的块

    你会写的事实

    Console.WriteLine(i);
    
    for
    循环之后,它仍然编译,这表明它仍然在范围内。
    foreach
    循环的每次迭代都使用不同的
    i
    变量,但在
    foreach
    循环中的任何地方,
    i
    都在范围内。(即使在声明之前也是如此——您不能使用它,但它仍在范围内。)


    我会给出和你一样的答案,作为对所问问题的最佳近似。我建议您发电子邮件给Pluralsight,要求他们改进问题。

    问题在哪里?循环I变量再次初始化后为零,变量I何时超出范围?抱歉:)回答2-在foreach之后,而不是foreach之后。看起来这是一个旨在让你明白而不是测试知识的问题。退出for循环后,
    foreach
    循环将(可能)再次迭代,创建一个新的
    i
    变量。因此从技术上讲,在下一次
    foreach
    迭代之前退出
    for
    循环(因为它不再使用)时,它将超出范围,因为您还没有实际退出
    foreach
    Console.WriteLine(i);