正在初始化 Base Class:声明一个变量两次?

Initializing Base Class: declaring a variable twice?

我目前正在阅读 C# 教程。现在我遇到了这个:

using System;

namespace RectangleApplication {
   class Rectangle {

      //member variables
      protected double length;
      protected double width;

      public Rectangle(double l, double w) {
         length = l;
         width = w;
      }
      public double GetArea() {
         return length * width;
      }
      public void Display() {
         Console.WriteLine("Length: {0}", length);
         Console.WriteLine("Width: {0}", width);
         Console.WriteLine("Area: {0}", GetArea());
      }
   }//end class Rectangle  
   class Tabletop : Rectangle {
      private double cost;
      public Tabletop(double l, double w) : base(l, w) { }

      public double GetCost() {
         double cost;
         cost = GetArea() * 70;
         return cost;
      }
      public void Display() {
         base.Display();
         Console.WriteLine("Cost: {0}", GetCost());
      }
   }
   class ExecuteRectangle {
      static void Main(string[] args) {
         Tabletop t = new Tabletop(4.5, 7.5);
         t.Display();
         Console.ReadLine();
      }
   }
}

class Tabletopcost 声明了两次。一次为 private double cost;,4 行后为 double cost;

Why is that so?

删除 double cost; 后代码仍然有效。当 double cost 在代码中时,我可以将鼠标悬停在 private double cost; 上并阅读消息:字段 Tabletop.cost 从未使用过”。我几乎可以删除任何一个成本并且代码工作正常.

  1. Did they forget to remove one of the declareation or is there a reason behind?
  2. Also, why don't I get an error message like "cost is already defined"?

这里是Tutorial link

事实上,在你的classTabletop中,范围cost是重叠的,因为在方法[=13=中也有一个名为cost的局部变量].

GetCost 的范围内,当您引用 cost 时,您实际上指的是名为 cost 的局部范围对象,而不是外部范围中的对象( class 中的一个)。发生这种情况时,在外部作用域中声明的 cost 被内部作用域隐藏(在方法中)。

在成员作用域(在您的情况下是在方法中)定义与现有成员同名的变量时,您只需隐藏后者并引用前者。

所以在你的例子中:

class Tabletop : Rectangle 
{
    private double cost;
    public Tabletop(double l, double w) : base(l, w) { }

    public double GetCost() 
    {
        double cost;  // this hides the field
        cost = GetArea() * 70;
        return cost;  // this referts to the variable defined two lines above
    }
    public void Display() 
    {
        Console.WriteLine("Cost: {0}", cost); // while this refers to the field
    }
}

cost from within GetCost 将引用 local 变量,而使用 cost 例如 Display 将引用 字段 .

这绝对没问题。然而,它可能会导致混乱,从而导致意外行为。这就是为什么一些开发人员倾向于使用 this-限定符:

public double GetCost() 
{
    double cost;
    this.cost = GetArea() * 70;
    return this.cost;
}

使用您引用当前实例的限定符,使 this.cost` 可以访问您的 字段 而不是变量。

In the class Tabletop there is cost declared twice. Once as private double cost; and 4 lines later as double cost;

好吧 private double cost;tableTop class 的成员字段,而其他声明是方法主体的本地声明。为什么会有混淆。

private double cost;未使用,可以删除。

您不会收到错误,因为正如约翰在评论中所说,它在不同的范围内;一个被定义为 class 的字段,而另一个是局部变量。当使用 cost 时,访问的是局部变量。要访问该字段,可以使用 this.cost

class A
{
  private int a = 1;

  void A()
  {
    int a = 2;

    Console.WriteLine(a); // 2
    Console.WriteLine(this.a); // 1
  }
}

注意你不能有多个同名的局部变量,即使在不同的范围内也是如此:

void A()
{
  int a = 1;

  if(someCondition)
  {
    int b = 2; // Compiler error: A local variable named 'a' cannot be declared in this scope because it would give a different meaning to 'a', which is already used in a 'parent or current' scope to denote something else
  }
}

我想他们确实忘了删除它。

为什么你没有得到 "cost is already defined" 错误,这是因为 GetCost() 中的 double cost 是本地的(只能在 GetCost() 方法内部访问,并且会被销毁GetCost() 方法完成后从内存中获取),而 private double cost 可供整个 Tabletop class 访问,只要 [=15] =]实例直播。