尝试在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
您的代码有两个错误:
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; }
}