只读和私有方法的问题
Posted
技术标签:
【中文标题】只读和私有方法的问题【英文标题】:Issues with readonly and private methods 【发布时间】:2013-10-06 07:38:58 【问题描述】:“创建一个名为“DemoSquare”的程序,它启动一个由 10 个 Square 对象组成的数组,这些对象的边的值为 1 -10,并显示每个正方形的值。Square 类包含面积和长度的字段边,以及需要面积和边长参数的构造函数。构造函数将其参数分配给正方形边的长度并调用计算面积字段的私有方法。还包括只读属性以获取一个正方形的边和面积。”
现在我认为这是一个棘手的问题,因为由于只读分配,我无法使用私有方法来计算面积,但这是我的代码:
class demoSquares
static void Main(string[] args)
Square[] squares = new Square[10];//Declares the array of the object type squares
for (int i = 0; i < 10; i++)
//Console.WriteLine("Enter the length");
//double temp = Convert.ToDouble(Console.ReadLine());
squares[i] = new Square(i+1);//Initializes the objects in the array
for (int i = 0; i < 10; i++)
Console.WriteLine(squares[i]);
//end for loop, prints the squares
//end main
//end class
这是 Square 类:
public class Square
readonly double length;
readonly double area;
public Square(double lengths)//Constructor
length = lengths;
area = computeArea();
private double computeArea()//getmethod
double areaCalc = length * length;
return areaCalc;
【问题讨论】:
是的,我通过创建一个访问器方法而不是将 area 参数声明为只读,但练习似乎非常具体。这一章是关于访问器和类的,但我不明白为什么我们的讲师会使用一些不起作用的东西? 【参考方案1】:不要将只读属性与只读字段混淆。
public class Square
public Square(double lengths)
Length = lengths;
Area = computeArea();
//Read only property for Length (privately settable)
public double Length get; private set;
//Read only property for Area (privately settable)
public double Area get; private set;
//Private method to compute area.
private double ComputeArea()
return Length * Length;
【讨论】:
【参考方案2】:只读变量确实可以在构造函数中赋值,但不能在构造函数调用的方法中赋值。有办法做到这一点,即:link。正确的方法是计算面积并将结果存储在面积变量中。
不过,我相信问题的含义有所不同。引用你的话:
还包括用于获取 Squares 边和面积的只读属性。
意思是,这个问题意味着你使用Properties
。这意味着,您将为length
和area
使用私有变量,并为每个变量实现一个仅获取属性:
public double Area
get
return area;
【讨论】:
【参考方案3】:问题提到只读属性,而不是只读字段。
只读字段只能在构造函数或字段初始值设定项中分配。 只读属性只能在类内部赋值。
public class Square
// Readonly field, can only be assigned in constructor or initializer
private readonly double _sideLength;
// Readonly property since it only contains a getter
public double SideLength get return _sideLength;
// Readonly property from outside the class since the setter is private
public double Area get; private set;
public Square( double sideLength )
_sideLength = sideLength;
CalcSquare();
private void CalcSquare()
this.Square = _sideLength * _sideLength;
【讨论】:
【参考方案4】:考虑如果您不尝试将计算区域分配给area
字段,而是从computeArea
返回值,您将如何重构代码。
作为一个额外的练习,尝试将computeArea
设为静态,看看这对代码有何影响。
【讨论】:
我看到了那里的逻辑,但是现在在显示该对象时,它只显示我在 DemoSquares 类中调用它时的类型【参考方案5】:你的分配从来没有说过你的私人功能应该分配区域。它说 构造函数 应该使用私有方法的结果分配区域:
public class Square
private readonly double length;
private readonly double area;
public Square(double length)
this.length = length;
this.area = computeArea(length); // assignment of area in constructor!
private double ComputeArea(double length)
return length * length;
【讨论】:
以上是关于只读和私有方法的问题的主要内容,如果未能解决你的问题,请参考以下文章