【问题标题】:C# Stack overflow exception when trying to Set in Get尝试在 Get 中设置时出现 C# 堆栈溢出异常
【发布时间】:2013-02-16 01:35:49
【问题描述】:

所以我试图对此保持聪明,但看起来这个想法很愚蠢,因为我马上就遇到了堆栈溢出异常。

理想情况下,我希望CheckInternetStatus 在我使用IsConnected 标志时运行。

我怎样才能正确地做到这一点?或者这根本不是一个好主意?

public static class Internet
{
    public static bool IsConnected
    {
        get
        {
            CheckInternetStatus();
            return IsConnected;
        }
        set
        {
            IsConnected = value;
        }
    }
}

其他信息:CheckInternetStatus 更新 IsConnected

【问题讨论】:

    标签: c# get set stack-overflow


    【解决方案1】:

    您的代码有两处错误:

    1) 没有后备变量,你在递归调用属性IsConnected

    private bool _isConnected;
    
    public static bool IsConnected
    {
        get
        {
            _isConnected = CheckInternetStatus();
            return _isConnected;
        }
        set
        {
            _isConnected = value;
        }
    }
    

    2) 您不应该在房产中做“大量工作”。改用一种方法。这可以更好地向阅读您的代码的人传达意图

    其实三件事:

    3) 如果您坚持使用属性(我不会),那么 setter 可能应该是 private。如果您没有实际连接,则不希望设置为已连接。

    【讨论】:

    • 感谢您的回答。我投了你的票,因为它最简洁、最深入。
    【解决方案2】:

    认为你想要

    private static bool _isConnected;
    public static bool IsConnected
        {
            get
            {
                CheckInternetStatus();
                return _isConnected;
            }
            set
            {
                _isConnected= value;
            }
        }
    

    因为你递归调用你的属性

    【讨论】:

      【解决方案3】:

      在这种情况下,支持字段非常有用。

      private static bool _isConnected;
      
      public static bool IsConnected {
          get {
              CheckInternetStatus();
              return _isConnected;
          }
          set {
              _isConnected= value;
          }
      }
      

      替代方案

      其他信息:CheckInternetStatus 更新 IsConnected

      CheckInternetStatus 应该操作私有字段。此外,set 应该是私有的(或者可能不存在)。但是IsConnected 似乎有一些意想不到的副作用(连接行为)。相反,怎么样:

      public static bool IsConnected {
          get;
          private set;
      }
      
      public static void Connect(){
          if( IsConnected ){
              // exit, or fail if this is considered an exceptional scenario
          }
      
          // do work
          IsConnected = true;
      }
      
      // call
      if( !Foo.IsConnected ){
          Foo.Connect();
      }
      

      这看起来更清晰,更明显。属性(作为一般规则)不应执行大量工作。

      【讨论】:

      • 请记住CheckInternetStatus() 也应该设置为_isConnected 而不是IsConnected
      【解决方案4】:

      你在无限递归。

      return IsConnected;
      

      调用你的getter,它一次又一次地调用你的getter,直到你崩溃。

      【讨论】:

        【解决方案5】:

        你做错了。你需要一些实例变量。你在呼唤自己。更正如下:

        public static class Internet
        {
        private static bool _isConnected;
        
        public static bool IsConnected
        {
            get
            {
                CheckInternetStatus();
                return _isConnected;
            }
            set
            {
                _isConnected = value;
            }
        }
        

        }

        【讨论】:

          【解决方案6】:

          我觉得你也可以这样用,

                 private static bool _isConnected;
          
                  public static bool isConnected
                  {
                      get { CheckInternetStatus(); return _isConnected; }
                      set { isConnected = value; }
                  }
          

          【讨论】:

          • 这与已经陈述相同内容的六个答案有何不同?
          • 哎呀对不起,我忘了刷新页面,所以我没有注意到已经有答案,对不起,
          • 没问题。您应该会在页面上看到一个栏显示“此问题的新答案”,您可以单击该栏以查看新答案并保存对已回答问题的回答。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-27
          • 2010-12-08
          • 2020-11-14
          相关资源
          最近更新 更多