所以我试图对此明智一点,但看起来这个想法是非常愚蠢的,因为我马上得到了一个堆栈溢出异常。
理想情况下,每当我使用CheckInternetStatus
标志时,我都希望IsConnected
能够运行。
如何正确完成此操作?或者这根本不是一个好主意?
public static class Internet
{
public static bool IsConnected
{
get
{
CheckInternetStatus();
return IsConnected;
}
set
{
IsConnected = value;
}
}
}
其他信息:CheckInternetStatus
更新IsConnected
答案 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; }
}