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

本文关键字:堆栈 栈溢出 异常 Get 设置 | 更新日期: 2023-09-27 17:59:31

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

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

我怎样才能正确地完成这项工作?或者这根本不是一个好主意?

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

附加信息:CheckInternetStatus更新IsConnected

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

您的代码有两个错误:

1)没有支持变量,您正在递归调用属性IsConnected:

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

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

实际上有三件事:

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

认为您想要

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

因为您正在递归调用属性

在这种情况下,后备字段非常有用。

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

这似乎更干净、更明显。属性(作为一般规则)不应该执行大量的工作。

您正在无限递归。

return IsConnected;

调用你的getter,它一次又一次、无限地调用你的吸气剂,直到你崩溃。

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

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

}

我想你也可以这样使用

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