为什么RotateFlipType枚举的实现方式不一样?

本文关键字:方式 不一样 实现 RotateFlipType 枚举 为什么 | 更新日期: 2023-09-27 18:14:39

下面是。net 4中RotateFlipType枚举的声明:

public enum RotateFlipType
{
    Rotate180FlipXY = 0,
    RotateNoneFlipNone = 0,
    Rotate270FlipXY = 1,
    Rotate90FlipNone = 1,
    Rotate180FlipNone = 2,
    RotateNoneFlipXY = 2,
    Rotate270FlipNone = 3,
    Rotate90FlipXY = 3,
    Rotate180FlipY = 4,
    RotateNoneFlipX = 4,
    Rotate90FlipX = 5,
    Rotate270FlipY = 5,
    RotateNoneFlipY = 6,
    Rotate180FlipX = 6,
    Rotate90FlipY = 7,
    Rotate270FlipX = 7,
}

我理解这些值是如何配对在一起的操作,否则会有相同的结果。当将调试器值与RotateFlipType.ToString值进行比较时,上面的枚举变得不友好。也不适合数据绑定场景。例如:

var value = RotateFlipType.RotateNoneFlipNone; // Debugger shows correct string for [value] which is [RotateNoneFlipNone].
var text = value.ToString(); // Output of [text] is [Rotate180FlipXY]. Presumably because it is declared first in the list.

这和操作的排序有关系吗?他们是否可以不使用[Flags]或将枚举分为两个(分离旋转和翻转)?

为什么RotateFlipType枚举的实现方式不一样?

我意识到马早就走了,没必要关马厩的门,但是…

在这个模式中选择这些常数是为了使图像反射更容易。

要水平翻转,可以使用这个简单的操作:

rotation_value ^= 4;

垂直翻转:

rotation_value ^= 6;

同时翻转两个(180度旋转):

rotation_value ^= 2;

枚举重写ToString方法以使用Enum.GetName来查找给定值的名称。对于GetName, MSDN有以下注释:

如果多个枚举成员具有相同的基础值,则GetName方法保证它将返回的名称。枚举成员。然而,它不能保证它会始终返回相同枚举成员的名称。因此,当多个枚举成员具有相同的值时应用程序代码永远不应该依赖于返回特定成员的名称。

因此,如果多个成员具有相同的值,则不能保证ToString将为您提供原始名称