可以在Ne-stead /相同范围内的c#中声明多次相同的名称变量吗?

时间:2017-07-20 13:48:36

标签: c# .net visual-studio

namespace project1
{
    public class testclass
    {
        int i = 0;

        public int foobar()
        {
            int i = 1;
            return i;
        }
    }
}

结果:

  

1

我宣布两次i变量。为什么c#编译器允许我这个?

如果我尝试在相同的范围内声明,那么编译器会给我异常,为什么允许在嵌套范围内?

2 个答案:

答案 0 :(得分:3)

这不是错误

您可以随时使用int i访问类声明中的字段this.i,因此不会重叠。实际上,这实际上是在camelCase中的方法中编写(私有)字段名称,参数和局部变量的约定。另一方面,属性,方法名称,类名等用PascalCase编写。

因此,如果您要访问班级的i字段,可以在课堂上编写this.i。否则,只要您在i - 区块内,您就会访问范围指定变量if

namespace Project1 // PascalCase here for namespace name
{
    public class TestClass // Again PascalCase for class name.
    {
        int i = 0; // camelCase correct here for field name.

        public void Foobar() // PascalCase for method name.
        {
            if (0 == 0)
            {
                int i = 0; // camelCase correct here for local variable name. 
                           // Cannot be re-declared until your if-block is finished.

                // accessing both elements named 'i'
                this.i = i;
            }

        return;
        }
    }
}

有关详细信息,请参阅Microsoft docs

答案 1 :(得分:0)

在特定范围内声明的所有变量必须是唯一的。

您可以根据数据类型重用某些变量,但是否应该重用变量取决于您正在做什么。

您的代码可以正常运行,但您第二次声明namespace project1 { public class testclass { int i = 0; public void foobar() { if (0 == 0) { int j = 0; } return; } } } 是错误的,因为它已经存在且值为0.

您需要更改其值,而不是尝试重新创建变量:

.your-parent-class-name .layer-content:before {
    content: "!";
}

您还可以创建一个新变量:

if (tree == null || !tree.IsActive || tree.FilterNodes == null)
{
     return false;
}
var result = false;
foreach (var filter in tree.FilterNodes.Where(a => a.IsActive && a.ConditionNodes != null))
{
     var tempBool = false;
     foreach (var condition in filter.ConditionNodes.Where(a => a.IsActive))
     {
          if (!string.IsNullOrWhiteSpace(condition.FieldName) && values.ContainsKey(condition.FieldName))
          {
               var value = values[condition.FieldName];
               if (filter.LogicalOperator == LogicalOperator.Or && ApplyCondition(condition.ConditionOperator, value, condition.FieldValue))
               {
                   tempBool = true;
                   break;
               }
               else if (filter.LogicalOperator == LogicalOperator.And)
               {
                   tempBool = ApplyCondition(condition.ConditionOperator, value, condition.FieldValue);
                   if (!tempBool)
                   {
                        break;
                   }
               }
               else
               {
                   tempBool = false;
               }
           }
           else if (!string.IsNullOrWhiteSpace(condition.FieldName) && filter.LogicalOperator == LogicalOperator.And)
           {
                tempBool = false;
           }
     }
     result = tempBool;
     if (!result)
     {
          break;
     }
}
return result;