c# - 取消标记不存在的信号会清除标记
问题描述
我有 ac# 代码,其中删除不存在的标志会导致不可预测的结果。
场景 #1:删除 .LONG_SIDEWAYS 会清除所有标志。
场景#2:移除一个不存在的不同标志仍然保持标志完整
using System;
public class Program
{
[Flags]
enum Signals : long
{
NONE = 0,
LONGPULLBACK = 2,
SHORTPULLBACK = 4,
RSIOVERSOLD = 8,
RSIOVERBOUGHT = 16,
BOUGHTSIGNAL = 32,
DOUBLEBOUGHTSIGNAL = 64,
SOLDSIGNAL = 128,
DOUBLESOLDSIGNAL = 256,
MATRENDINGLONG = 512,
MATRENDINGSHORT = 1024,
LONG_SIDEWAYS = 2014,
SHORT_SIDEWAYS = 4096,
MOVEDTOWARDSLONG = 8192,
MOVEDTOWARDSSHORT = 16384,
LOOK4LONGBREAKOUT = 32768,
LOOK4SHORTBREAKOUT = 65536,
GOTLONGBREAKOUT = 131072,
GOTSHORTBREAKOUT = 262144
}
;
public static void Main()
{
Program p = new Program();
Signals signalsobject = Signals.NONE;
Console.WriteLine("Hello World");
signalsobject = addSignals(p, signalsobject);
Console.WriteLine("Scenario #1 removing .LONG_SIDEWAYS that does not exist leads to Signals.NONE");
Console.WriteLine(signalsobject);
Console.WriteLine("BEFORE REMOVING" + signalsobject);
// removing .LONG_SIDEWAYS that does not exist leads to Signals.NONE
signalsobject = p.UnsetFlag(signalsobject, Signals.LONG_SIDEWAYS);
Console.WriteLine("AFTER REMOVING SIGNAL THAT DOES NOT EXIST" + signalsobject);
// readd and test
Console.WriteLine("Scenario #2 removing ..MATRENDINGLONGS that does not exist leads to showing the flags kept as is.");
signalsobject = addSignals(p, signalsobject);
Console.WriteLine("BEFORE REMOVING" + signalsobject);
// removing ..MATRENDINGLONGS that does not exist leads to showing the flags kept as is.
signalsobject = p.UnsetFlag(signalsobject, Signals.MATRENDINGLONG);
Console.WriteLine("AFTER REMOVING SIGNAL THAT DOES NOT EXIST" + signalsobject);
}
private static Signals addSignals(Program p, Signals signalsobject)
{
signalsobject = p.SetFlag(signalsobject, Program.Signals.LONGPULLBACK);
signalsobject = p.SetFlag(signalsobject, Program.Signals.SHORTPULLBACK);
signalsobject = p.SetFlag(signalsobject, Program.Signals.RSIOVERSOLD);
signalsobject = p.SetFlag(signalsobject, Program.Signals.RSIOVERBOUGHT);
signalsobject = p.SetFlag(signalsobject, Program.Signals.DOUBLEBOUGHTSIGNAL);
signalsobject = p.SetFlag(signalsobject, Program.Signals.SOLDSIGNAL);
signalsobject = p.SetFlag(signalsobject, Program.Signals.DOUBLESOLDSIGNAL);
return signalsobject;
}
Signals SetFlag(Signals orignal, Signals newFlag)
{
return orignal | newFlag;
}
Signals UnsetFlag(Signals original, Signals flag2remove)
{
return original & (~flag2remove);
}
// Works with "None" as well
Signals ToogleFlag(Signals orignal, Signals flag2toggle)
{
return orignal ^ flag2toggle;
}
}
解决方案
这是您的第一个问题:
LONG_SIDEWAYS = 2014,
这些看起来像是单位掩码,因此正确的值是, 或. 您当前使用的值会消失:211
2048
2014
1024 MATRENDINGSHORT
512 MATRENDINGLONG
256 DOUBLESOLDSIGNAL
128 SOLDSIGNAL
64 DOUBLEBOUGHTSIGNAL
16 RSIOVERBOUGHT
8 RSIOVERSOLD
4 SHORTPULLBACK
2 LONGPULLBACK
====
2014
这些涵盖了您在调用时添加的所有addSignals()
位,因此最终会给您一个空掩码。
对于您的第二个问题,根据您的代码注释:
...删除
MATRENDINGLONGS
不存在的会导致显示保持原样的标志。
假设我理解您的评论,这是可以预料的。您正在清除已经很清楚的一点,因此不会有明显的变化。
这就像你有一个只有橙子和香蕉的水果篮,然后决定把所有的苹果都拿出来。然后你会担心它没有苹果的事实:-)
如果您尝试设置或切换它(添加一个苹果),您应该会看到变化。
推荐阅读
- javascript - Google Charts,带有 AJAX 请求的日历实现
- godot - 动态创建动画以显示文本
- html - 引导程序 | 链接在带有 my-auto 类的 div 中不起作用
- r - 用 R 语言创建一个包含 2 的前 10 次方,然后是 3 的前 10 次方的向量
- screenshot - OutputType 的原始类型 int 在使用屏幕截图代码时没有字段 FILE
- spring-boot - 我应该将依赖项 spring-boot-starter 包含到我的自定义 Spring Boot 启动器中吗?
- python - CSV 文件到列表中 - 用户输入确定要输出给用户的行
- javascript - Vuetify v-data-table 不会显示数据
- multithreading - lock(mutex) 实现通常会尝试确定互斥锁被锁定多长时间以及在哪个核心上?如果不是,为什么不呢?
- html - 如果屏幕更改为像移动设备这样的小屏幕,则将 div 更改为全屏