初始化基类:两次声明一个变量?

时间:2018-09-12 08:19:32

标签: c# class inheritance declare

我目前正在阅读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 Tabletop中,两次声明了cost。一次为private double cost;,四行之后为double cost;

  

为什么会这样?

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

  
      
  1. 他们忘了删除其中一个声明吗?还是背后有原因?
  2.   
  3. 而且,为什么我没有收到诸如“费用已定义”之类的错误消息?
  4.   

这里是Tutorial link

5 个答案:

答案 0 :(得分:2)

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

您不会收到错误,因为正如约翰在评论中所说,这是在不同的范围内。一个定义为类的字段,而另一个定义为局部变量。使用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
  }
}

答案 1 :(得分:1)

实际上,在类Tabletop中,范围cost是重叠的,因为方法cost中还有一个名为GetCost的局部变量。

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

答案 2 :(得分:1)

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

在您的示例中:

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中的

GetCost将引用 local 变量,而在cost中使用Display该示例将参考字段

这绝对好。但是,它可能会导致混乱,从而导致意外行为。这就是为什么某些开发人员倾向于使用this限定符的原因:

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

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

答案 3 :(得分:1)

我认为他们确实忘记删除它。

为什么没有收到“费用已经定义”错误的原因,是因为double cost中的GetCost()是本地的(只能在GetCost()方法中访问,并且会从GetCost()方法完成后的内存),而private double cost可用于整个Tabletop类进行访问,并且只要Tabletop实例有效就将保留在内存中。

答案 4 :(得分:0)

  

在“桌面”类中,成本声明为两次。曾经是私人的   双重成本;以后再加4行,就成了双倍费用;

Well private double cost;tableTop类的成员字段,而其他声明在方法主体中是局部的。为什么会有困惑。