readonly和private方法的问题

时间:2013-10-06 07:38:59

标签: c# constructor readonly

“创建一个名为”DemoSquare“的程序,它启动一个10个Square对象的数组,其边长为1-10,并显示每个方块的值.Start类包含区域的字段和长度。 side,以及一个构造函数,它需要一个区域的参数和一个边的长度。构造函数将其参数分配给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 Class:

   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;
    }
}

5 个答案:

答案 0 :(得分:7)

不要将只读属性与只读字段混淆。

   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;
        }
    }

答案 1 :(得分:2)

这个问题提到了readonly属性,而不是readonly字段。

readonly字段只能在构造函数或字段初始值设定项中分配。 readonly属性只能在类中分配。

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;
   }
}

答案 2 :(得分:2)

确实可以在构造函数中指定只读变量,但不能在从constrctor调用的方法中指定。有办法做到这一点,即:link。正确的方法是计算面积并将结果存储在区域变量中。

但是,我相信,问题的含义是不同的。引用你:

  

还包括只读属性以获取Squares侧和区域。

意思是,这个问题意味着您使用Properties。这意味着,您将使用lengtharea的私有变量,并为每个变量实现一个get-only属性:

public double Area 
{
    get
    {
       return area;
    }
}

答案 3 :(得分:0)

如果您没有尝试将计算区域分配到area字段,而是从computeArea返回值,请考虑重构代码的方式。

作为一项额外练习,请尝试将computeArea设为静态,并查看它对代码的影响。

答案 4 :(得分:0)

您的分配从未说过您的私人功能应分配区域。它说构造函数应该为区域分配私有方法的结果:

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;
    }
}