尝试在Get中设置时出现C#堆栈溢出异常

时间:2013-02-16 01:35:50

标签: c# get set stack-overflow

所以我试图对此明智一点,但看起来这个想法是非常愚蠢的,因为我马上得到了一个堆栈溢出异常。

理想情况下,每当我使用CheckInternetStatus标志时,我都希望IsConnected能够运行。

如何正确完成此操作?或者这根本不是一个好主意?

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

其他信息:CheckInternetStatus更新IsConnected

6 个答案:

答案 0 :(得分:5)

您的代码有两个问题:

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

private bool _isConnected;

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

2 )你不应该在房产中做很多工作。请改用方法。这更好地传达了阅读代码的人的意图

实际上有3件事:

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

答案 1 :(得分:4)

认为你想要

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

因为你递归地调用了你的财产

答案 2 :(得分:1)

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

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();
}

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

答案 3 :(得分:0)

你无限递归。

return IsConnected;

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

答案 4 :(得分:0)

你做错了。你需要一些实例变量。你在呼唤自己。更正看起来像:

public static class Internet
{
private static bool _isConnected;

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

}

答案 5 :(得分:0)

我想你也可以这样使用,

       private static bool _isConnected;

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