Fla*_*ash 15 .net c# design-decisions
微软是否有理由决定制作这些结构?
这三个都是可变的.如果它们是不可变的,或者它们是引用类型,我会发现它们更容易处理.
如果有理由它们必须是结构,为什么它们是可变的?
Rot*_*tem 19
值语义
这些值的两个相同实例之间没有本质区别.任何Point带坐标的,[2,3]都等于具有相同坐标的任何其他点,就像任何两个int具有相似值的s相等.这符合设计准则:
它逻辑上表示单个值,类似于基本类型(整数,双精度等).
性能
值类型分配和取消分配更便宜.
通常需要创建这些值的许多实例.结构的成本较低,如果它们是本地值,它们将在堆栈上创建,从而减轻GC的压力.
大小
让我们考虑这些值的大小
Point:: 8个字节
Size:8个字节
Rectangle:16个字节
对于Point和Size,它们的大小与对64位系统中的类实例的引用相同.
根据Microsoft的指导原则引用:在类和结构之间进行选择
这些结构是完全可变的.为了性能,这是完成的(违反指南),因为它避免了为修改操作创建新值的需要.
关于评论中OP的代码示例:
Point[] points = new Point[] { new Point(0,0), new Point(1,1), new Point(2,2) };
foreach (Point p in points)
{
p.X += 1;
}
Run Code Online (Sandbox Code Playgroud)
这种情况的唯一原因foreach失败了,是因为(感谢拉杰夫)的迭代器值返回数据,而你只会在更改复制的价值.p被装箱到object以提供迭代,而你Cannot modify the result of an unboxing conversion,
这很好用:
for (int i = 0; i < points.Length; i++)
{
points[i].X += 1;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4537 次 |
| 最近记录: |