正在初始化 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 Tabletop
中 cost
声明了两次。一次为 private double cost;
,4 行后为 double cost;
Why is that so?
删除 double cost;
后代码仍然有效。当 double cost
在代码中时,我可以将鼠标悬停在 private double cost;
上并阅读消息:字段 Tabletop.cost
从未使用过”。我几乎可以删除任何一个成本并且代码工作正常.
- Did they forget to remove one of the declareation or is there a reason behind?
- Also, why don't I get an error message like "cost is already defined"?
事实上,在你的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] =]实例直播。
我目前正在阅读 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;
,4 行后为 double cost;
Why is that so?
删除 double cost;
后代码仍然有效。当 double cost
在代码中时,我可以将鼠标悬停在 private double cost;
上并阅读消息:字段 Tabletop.cost
从未使用过”。我几乎可以删除任何一个成本并且代码工作正常.
- Did they forget to remove one of the declareation or is there a reason behind?
- Also, why don't I get an error message like "cost is already defined"?
事实上,在你的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] =]实例直播。