只读和私有方法的问题

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。这意味着,您将为lengtharea 使用私有变量,并为每个变量实现一个仅获取属性:

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;
    

【讨论】:

以上是关于只读和私有方法的问题的主要内容,如果未能解决你的问题,请参考以下文章

只读字段和私有 getter 属性之间的区别

Objective-C:(私有/公共属性)为外部类调用设置只读属性,为自调用设置只读属性

C# 类和只读成员

何时应将属性设为私有并设为只读属性? [关闭]

类变量:公共访问只读,但私有访问读/写

如何使用属性将私有数组公开为只读? [关闭]