如何在第二个示例中使用只读修饰符实现类的直角三角形部分
本文关键字:实现 直角三角形部 只读 第二个 | 更新日期: 2023-09-27 17:56:01
下面是《图解 C# 2012》一书中的两个不同示例。在第一个示例中,斜边声明为 readonly
。在第二个示例中,PI
和 numberofsides
声明为 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等属性。然后将形状细分为具体形状,如直角三角形、圆形、正方形。这些子类可以有自己的构造函数来初始化特定的子类。
查看这方面的工厂模式或继承构造。这种模式是教科书上的例子。