【问题标题】:Return bool with if statement使用 if 语句返回 bool
【发布时间】:2013-07-22 21:43:50
【问题描述】:

我的代码需要一些帮助,因为它总是返回 false,使用 C# XNA 4.0

在我的 Game1.cs 上运行此代码

if (!Connection.sendPacketBool("Check", versionPacket))
        {
            Connection.closeConnection();
            this.Exit();
        }

在我的班级连接中,我有这个

public static bool final;
public static bool sendPacketBool(String type, String data)
    {
        try
        {
            NetworkComms.SendObject(type, serverIp, serverPort, data);
            NetworkComms.AppendGlobalIncomingPacketHandler<string>("ClientV",
           (header, connection, array) =>
           {
               if (array == "false")
               {
                   final = false;
               }
               else
               {
                   final = true;
               }
           });
        }
        catch (Exception ex)
        {

        }
        if (!final)
        {
            return false;
        }
        else
        {
            return true;
        }
    }

事情是最终的总是假的,除非我这样做

        public static bool final = true;

如何更改此代码以使其返回真或假?我做不到

if (array == "false")
               {
                   final = false;
                   return false;
               }
               else
               {
                   final = true;
                   return true;
               }

因为我得到错误

NetworkComms.AppendGlobalIncomingPacketHandler 返回 void a return 关键字后面不能跟对象表达式

谢谢

【问题讨论】:

  • 在异常捕获块中放一条打印语句,看是否打印。我怀疑您遇到了异常,这就是它永远不会更新的原因。

标签: c# boolean return


【解决方案1】:

问题在于设置final 的代码发生在回调中,并且是异步的。您正在同步属性中返回值。

因此,final 设置在您的属性 getter 被返回之后。

在 C# (4+) 中处理此问题的惯用方法是返回 Task&lt;bool&gt; 而不是布尔值。这将允许您返回一个对象,该对象将在回调完成时设置布尔值。你可以这样写:

public static Task<bool> SendPacketBoolAsync(string type, string data)
{
    var tcs = new TaskCompletionSource<bool>();
    try
    {
        NetworkComms.SendObject(type, serverIp, serverPort, data);
        NetworkComms.AppendGlobalIncomingPacketHandler<string>("ClientV",
           (header, connection, array) =>
           {
              if (array == "false")
              {
                 tcs.TrySetResult(false);
              }
              else
              {
                 tcs.TrySetResult(true);
              }
           });
    }
    catch (Exception ex)
    {
         tcs.TrySetException(ex);
    }

    return tcs.Task;
}

【讨论】:

  • 我应该如何获得回报? if (!Connection.sendPacketBool("Check", versionPacket)) 不行
  • @AlvaroCarvajalNakosmai 如果您使用的是 VS 2012,async/await 让这一切变得简单:bool check = await Connection.SendPacketBoolAsync("Check, versionPacket); if (!check) { ... }
  • @AlvaroCarvajalNakosmai 然后您可以使用延续 - 请参阅:reedcopsey.com/2010/04/19/…
  • 非常感谢,真的帮了我!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-20
  • 2018-05-07
  • 2021-08-31
  • 2021-09-19
  • 2015-07-28
  • 2015-09-06
相关资源
最近更新 更多