首页 > 解决方案 > 取消标记不存在的信号会清除标记

问题描述

我有 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;
    }
}

标签: c#

解决方案


这是您的第一个问题:

LONG_SIDEWAYS = 2014,

这些看起来像是单位掩码,因此正确的值是, 或. 您当前使用的值会消失:21120482014

1024  MATRENDINGSHORT
 512  MATRENDINGLONG
 256  DOUBLESOLDSIGNAL
 128  SOLDSIGNAL
  64  DOUBLEBOUGHTSIGNAL
  16  RSIOVERBOUGHT
   8  RSIOVERSOLD
   4  SHORTPULLBACK
   2  LONGPULLBACK
====
2014

这些涵盖了您在调用时添加的所有addSignals()位,因此最终会给您一个空掩码。


对于您的第二个问题,根据您的代码注释:

...删除MATRENDINGLONGS不存在的会导致显示保持原样的标志。

假设我理解您的评论,这是可以预料的。您正在清除已经很清楚的一点,因此不会有明显的变化。

这就像你有一个只有橙子和香蕉的水果篮,然后决定把所有的苹果都拿出来。然后你会担心它没有苹果的事实:-)

如果您尝试设置或切换它(添加一个苹果),您应该会看到变化。


推荐阅读