我目前正在阅读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
从未使用过。”我几乎可以消除任何开销,并且代码可以正常工作
- 他们忘了删除其中一个声明吗?还是背后有原因?
- 而且,为什么我没有收到诸如“费用已定义”之类的错误消息?
答案 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
类的成员字段,而其他声明在方法主体中是局部的。为什么会有困惑。