我正在研究一个系统,用户可以通过GUI编辑现有对象("精确过滤"域对象).作为UI提示,我们只想在用户真正修改对象的内容时启用保存按钮.我想知道是否有人对这个问题有任何经验,以及最好的方法来解决这个问题.
我正在考虑向域对象添加一个isDirty()标志.当用户开始编辑过滤器时,我会制作一份副本,将其传递给GUI并让用户对副本进行修改.然后,对isDirty()标志的绑定将启用/禁用保存按钮.在保存时,差异将合并到原始对象中并保持不变.
另外,我在想如果用户撤消他对对象所做的更改会发生什么.然后isDirty()标志应返回false.所以我认为实现这一目标的唯一方法是将每个属性的原始值保留在域对象中.
有任何想法吗?
考虑一下:
[Flags]
enum Colors
{
Red=1,
Green=2,
Blue=4
}
Colors myColor=Colors.Red|Colors.Blue;
Run Code Online (Sandbox Code Playgroud)
目前,我的做法如下:
int length=myColors.ToString().Split(new char[]{','}).Length;
Run Code Online (Sandbox Code Playgroud)
但我希望有一种更有效的方法来查找长度,可能基于bitset操作.
如果可能,请说明解决方案的原因和方式.
此外,如果这是重复,请指出它,我将删除此问题.关于SO我能找到的唯一类似的问题关注的是找到所有可能的Colors枚举组合的长度,而不是myColors变量的长度.
更新:我仔细地对每个解决方案进行了基准测试(每个解决方案1 000 000次),结果如下:
Stevo3000是一个明显的赢家(Matt Evans持有银牌).
非常感谢您的帮助.
更新2:此解决方案运行速度更快:100 000次迭代时为41 ms(比Stevo3000快约40倍(32位操作系统))
UInt32 v = (UInt32)co;
v = v - ((v >> 1) & 0x55555555);
v = (v & 0x33333333) + ((v >> 2) & 0x33333333);
UInt32 count = ((v + (v …Run Code Online (Sandbox Code Playgroud) 而不是这样做为标志枚举变量添加一个值:
MyFlags flags = MyFlags.Pepsi;
flags = flags | MyFlags.Coke;
Run Code Online (Sandbox Code Playgroud)
我想创建一个扩展方法来实现这一点:
MyFlags flags = MyFlags.Pepsi;
flags.Add(MyFlags.Coke);
Run Code Online (Sandbox Code Playgroud)
可能?你怎么做呢?
是否有可以放入Other Linker FlagsXcode Build Settings字段的所有标志的列表?
我搜索了开发人员文档而没有结果.
我有以下情况:我的问题围绕使用强类型枚举类作为标志(就像在C#中使用Flags-Attribute一样).我知道这不是枚举类首先使用的方式,但这不是这个问题的重点.
我已经定义了几个要在这些枚举类上使用的运算符和函数,以及一个自定义类型特征,用于区分常规枚举和Flag-enums.这是一个例子:
// Default type_trait which disables the following operators
template <typename T> struct is_flags : std::false_type {};
// Example operator to use enum class as flags
template <typename T>
std::enable_if_t<std::is_enum<T>::value && is_flags<T>::value, T&>
operator|=(T &t1, const T t2)
{
return t1 = static_cast<T>(static_cast<std::underlying_type_t<T>>(t1) |
static_cast<std::underlying_type_t<T>>(t2));
};
Run Code Online (Sandbox Code Playgroud)
现在如果我定义任何enum class我可以做以下事情:
enum class Foo { A = 1, B = 2 };
enum class Bar { A = 1, B = 2 };
// Declare "Bar" to be useable like …Run Code Online (Sandbox Code Playgroud) 我在C#中创建了一个标志枚举,类似于以下内容:
[Flags]
public enum DriversLicenseFlags
{
None = 0,
Suspended = 1 << 1,
Revoked = 1 << 2,
Restored = 1 << 3,
SuspendedAndRestored = Suspended | Restored,
RevokedAndRestored = Revoked | Restored,
}
Run Code Online (Sandbox Code Playgroud)
关于我的意图的一些注意事项:
Suspended并且Revoked是可以但不一定导致恢复的独特状态.Restored应该只有在用户已经Suspended或Revoked(或两者都有)的情况下才有可能.重要的是要具体跟踪哪个事件是恢复的前兆.Suspended和Revoked(和Restored)另外,我试图坚持在MSDN的Designing Flags Enumerations中提出的建议.特别是:
SuspendedAndRestored并且RevokedAndRestored两者都很常见.Restored除非至少有一个是无效的Suspended,并Revoked设置.理想情况下,我希望Restored在内部使用的枚举中存在一个值,但只能通过某些有效组合公开设置.不幸的是,internal它不是枚举值的有效修饰符.
我想过几个选择,但每个似乎都有缺点:
保留Restored作为公共值,请注意注释中的限制,并对公共API上的无效组合进行前置条件检查. …
我有一个脚本,可以使用几十个参数/标志Getopt::Long.某些标志不允许混合,例如:--linux --unix不允许一起提供.现在我知道我可以使用if声明检查,但我确信有更清洁,更好的方法.
if 如果我不想允许许多标志组合,块可能会变得丑陋.
有什么建议?
谢谢,
我正在模拟6502处理器,我差不多完成了(现在处于测试阶段)并且我正在使用来自nesdev站点的一些NES测试,它告诉我中断标志和未使用的第5个标志都是最初应该设置为1(即禁用中断),但为什么呢?我可以理解未使用的标志部分,因为它......很好......未使用,但我不明白中断标志.我试过在Google上搜索,有些网站确认它应该设置为1,但没有人解释这背后的原因.为什么中断应该从程序开始被阻止?
我目前有一些粗略的谷歌代码..这有效,但我想换成枚举.
目前我需要一个字节来表示一些设置的位标志,
我目前有这个:
BitArray bitArray =new BitArray(new bool[] { true, true, false, false, false, false, false, false });
Run Code Online (Sandbox Code Playgroud)
用于排队..
new byte[] {ConvertToByte(bitArray)})
Run Code Online (Sandbox Code Playgroud)
使用此站点的ConvertToByte ...
private static byte ConvertToByte(BitArray bits) // http://stackoverflow.com/questions/560123/convert-from-bitarray-to-byte
{
if (bits.Count != 8)
{
throw new ArgumentException("incorrect number of bits");
}
byte[] bytes = new byte[1];
bits.CopyTo(bytes, 0);
return bytes[0];
}
Run Code Online (Sandbox Code Playgroud)
但是,当我触及时,我想使用枚举,所以我创建它:
[Flags]
public enum EventMessageTypes
{
None = 0,
aaa = 1,
bbb = 2,
ccc = 4,
ddd = 8,
eee = 16,
fff = …Run Code Online (Sandbox Code Playgroud) 在反汇编中,我经常看到正在使用字符串操作指令而不考虑方向标志(DF)的状态,如下所示:
or ecx, 0FFFFFFFFh
xor eax, eax
mov edi, ebp
repne scasb
Run Code Online (Sandbox Code Playgroud)
CLD或者STD在函数开始后没有找到指令,也没有其他可能影响DF标志的指令.
那么,编译器在程序启动后,假定程序运行时,假定程序运行时保持预定义状态,并且在程序运行时保持不变?