1

だから私はこれについて賢くしようとしていますが、すぐにスタックオーバーフローの例外が発生しているため、この考えはかなりばかげているようです。

理想的には、フラグCheckInternetStatusを使用するたびに実行したいと思います。IsConnected

どうすればこれを正しく達成できますか? それとも、これはまったく良い考えではありませんか?

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

追加情報:CheckInternetStatus更新IsConnected

4

6 に答える 6

5

コードには次の 2 つの問題があります。

1 ) バッキング変数がありません。再帰的にプロパティを呼び出していますIsConnected:

private bool _isConnected;

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

2)プロパティで「多くの作業」を行うべきではありません。代わりにメソッドを使用してください。これにより、コードを読んでいる人に意図が伝わりやすくなります

実際には3つのこと:

3)プロパティの使用に固執する場合(私はそうしません)、セッターはおそらくprivate. 実際に接続していない場合は、接続済みを設定したくありません。

于 2013-02-16T01:39:45.193 に答える
4

あなたが欲しいと思います

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

プロパティを再帰的に呼び出しているため

于 2013-02-16T01:38:28.947 に答える
1

これは、バッキング フィールドが非常に役立つケースです。

private static bool _isConnected;

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

代替案

追加情報: CheckInternetStatus の更新 IsConnected

CheckInternetStatusprivate フィールドを操作する必要があります。さらに、 は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();
}

これはより明確で明白に見えます。プロパティは (原則として) 大量の作業を実行すべきではありません。

于 2013-02-16T01:38:52.663 に答える
0

こんな使い方もできると思いますが、

       private static bool _isConnected;

        public static bool isConnected
        {
            get { CheckInternetStatus(); return _isConnected; }
            set { isConnected = value; }
        }
于 2013-02-16T01:49:17.437 に答える
0

あなたは無限に再帰しています。

return IsConnected;

ゲッターを呼び出します。ゲッターは、クラッシュするまでゲッターを何度も何度も呼び出します。

于 2013-02-16T01:39:01.763 に答える
0

あなたはこれを間違っています。インスタンス変数が必要です。あなたは自分自身を呼んでいます。修正は次のようになります。

public static class Internet
{
private static bool _isConnected;

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

}

于 2013-02-16T01:39:53.553 に答える