【问题标题】:bool doesn't go true in my methodbool 在我的方法中不成立
【发布时间】:2016-03-13 10:45:03
【问题描述】:

我正在使用一些方法来设置一些值,但遗憾的是它没有将我的值设置为true,即使我告诉他是true。 您可以在下面找到具有我编写的实际值的方法:

LogPanelData(rcv_bStartGlue, send_bStartGlueACK, send_bStartGlueNACK, bLogRobotFile_OK, rcv_sFileNameRobot, LogLines);

您可以在下面找到包含所有信息的完整方法。在正常情况下a_rcvValuea_LogFile_OK 都是true。我第一次加载这个a_sendValueACk = false(在这种情况下是send_bStartGlueACK)。

正如您在方法中看到的那样,我第二次使用同一行(如上)进入此方法时,它不应该出现在第一个 if 语句中,因为 a_sendValueACK 应该是 true。但它告诉我的send_bStartGlueACK 一直都是假的,所以这是不正确的。那么,当我在这个方法中设置为真时,我的send_bStartGlueACK 将是真的,我该如何解决呢?

public void LogPanelData(bool a_rcvValue, bool a_sendValueACK, bool a_sendValueNACK, bool a_LogFile_OK, string a_LogFileName, string a_LogLines)
{
    if (a_rcvValue && !a_sendValueACK && a_LogFile_OK)
    {
        try
        {
            StreamWriter Sw = new StreamWriter(a_LogFileName, true);
            //regel schrijven
            Sw.WriteLine(a_LogLines);

            //SW afsluiten!!
            Sw.Close();

            //lijst opvullen met de regels voor output in programma
            listOutput.Add(a_LogFileName);
            listOutput.Add(a_LogLines);

            a_sendValueACK = true; //<<< This does go true, but not the value I send with it
        }
        catch
        {
            a_LogFileName = "Kan gegevens niet opslaan!";
            a_sendValueNACK = true;
        }
    }
    if (a_rcvValue && !a_LogFile_OK)
    {
        a_sendValueNACK = true;
    }
    if (!a_rcvValue && (a_sendValueACK || a_sendValueNACK))
    {
        send_bStartGlueACK = false;
        send_bStartGlueNACK = false;
    }
}

【问题讨论】:

标签: c# methods boolean


【解决方案1】:

你设置的布尔值只是changed inside the method本身,不在外面。值类型被复制到方法中,而不是被引用。设置它会改变副本,而不是原件。

一种解决方案是使用ref 来传递值更改它们:

public void LogPanelData( ref bool a_rcvValue
                        , ref bool a_sendValueACK
                        , ref bool a_sendValueNACK
                        , ref bool a_LogFile_OK
                        , string a_LogFileName
                        , string a_LogLines
                        )
{ }

调用它也需要ref

LogPanelData( ref rcv_bStartGlue
            , ref send_bStartGlueACK
            , ref send_bStartGlueNACK
            , ref bLogRobotFile_OK
            , rcv_sFileNameRobot
            , LogLines
            );

更好的方法是使用类来传递。如果属性总是可以组合在一起,这可能会有所帮助。

public void LogPanelData( LogSettings logSettings
                        , string a_LogFileName
                        , string a_LogLines
                        )
{ }

这将要求您创建一个课程LogSettings。在那里放入属性并将此对象从一种方法传递到另一种方法。我不确定,但如果 string 参数也可以放在类中可能会很好。

【讨论】:

  • 如果 OP 想要改变这些变量,最好将它们包装在一个类中。
  • 这也是一种选择,具体取决于具体情况。谢谢。
  • @juharr 好吧,我正在创建日志文件,每个文件都有不同的名称、文件等,也许为我的日志文件创建一个类会更好。感谢您的提示
  • @juharr 添加了一行关于您的方法。
  • 我的眼睛在流血!您刚刚采用了一些设计非常糟糕的代码,并通过在任何地方添加ref 使其变得更糟。正确的答案是完全重写代码,减少对多个bool 参数的依赖并返回集体结果,而不是void
猜你喜欢
  • 1970-01-01
  • 2021-03-10
  • 1970-01-01
  • 1970-01-01
  • 2010-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-30
相关资源
最近更新 更多