如何在第二个示例中使用只读修饰符实现类的直角三角形部分

本文关键字:实现 直角三角形部 只读 第二个 | 更新日期: 2023-09-27 17:56:01

下面是《图解 C# 2012》一书中的两个不同示例。在第一个示例中,斜边声明为 readonly 。在第二个示例中,PInumberofsides 声明为 readonly 。为什么PI被分配了一个值,而numberofsides没有?

const可以用来声明PI并为其赋值吗?假设我想在第二个示例中实现类形状的直角三角形部分。它是如何做到的,numberofsides已经声明并且双方没有分配值。我的意思是我如何找出哪一边是斜边?

class RightTriangle
{
   public double A = 3;
   public double B = 4;
   public double Hypotenuse // Read-only property
   {
      get{ return Math.Sqrt((A*A)+(B*B)); } // Calculate return value
   }
}
class Program
{
   static void Main()
   {
      RightTriangle c = new RightTriangle();
      Console.WriteLine("Hypotenuse: {0}", c.Hypotenuse);
   }
}
class Shape
{ 
    // Keyword Initialized
    // ↓↓
    readonly double PI = 3.1416;
    readonly int NumberOfSides;
    // ↑↑
    // Keyword Not initialized
    public Shape(double side1, double side2) // Constructor
    {
        // Shape is a rectangle
        NumberOfSides = 4;
        // ↑
        // ... Set in constructor
    }
    public Shape(double side1, double side2, double side3) // Constructor
    {
        // Shape is a triangle
        NumberOfSides = 3;
        // ↑
        // ... Set in constructor
    }
}

如何在第二个示例中使用只读修饰符实现类的直角三角形部分

量实际上嵌入到程序集的元数据中。如果有人引用您的常量,它也会被复制以提高性能。一般规则是永远不要对可能更改的值使用公共常量,因此Math.PI是一个常量。但不是double.Zero.常量永远不能是引用类型,只能是值类型。

使用static readonly可以解决此问题,因为它可以在运行时分配,因此永远不会以相同的方式存储值。当然,您可以将其预设为一个值,但区别在于外部应用程序不会获取分配的值并复制它。

另一个区别是不能在运行时为const赋值。readonly可以是更改,但只能在构造函数中更改。这就是为什么属性不能用 readonly 标记,但可以通过具有公共获取和私有只读字段来编码以使其正常工作。


为了回答您的问题,我会将PI标记为常量,或使用Math.PI。我还要说的是,您正在尝试的模式对于您想要的模式来说不够灵活。形状(2D?)应该是一个抽象类,并具有GetArea,GetPerimeter等方法以及Length和Height等属性。然后将形状细分为具体形状,如直角三角形、圆形、正方形。这些子类可以有自己的构造函数来初始化特定的子类。

查看这方面的工厂模式或继承构造。这种模式是教科书上的例子。