ホームページ > バックエンド開発 > C++ > 静的方法から非静的な方法を呼び出すのはなぜ「オブジェクト参照が必要です」と呼ぶのですか?

静的方法から非静的な方法を呼び出すのはなぜ「オブジェクト参照が必要です」と呼ぶのですか?

Susan Sarandon
リリース: 2025-02-02 17:41:11
オリジナル
335 人が閲覧しました

Why Does Calling a Non-Static Method from a Static Method Cause

c#エラーCS0120:オブジェクト参照が必要

このエラーは、「非定位フィールド、メソッド、またはプロパティにオブジェクト参照が必要です...」は、静的メソッド内から非静的メンバーにアクセスしようとするときに発生します()。 提供されたコードを調べてみましょう:

setTextboxText SumData問題は、静的メンバーと非静的メンバーの根本的な違いにあります:

namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        // ... other code ...

        private static void SumData(object state)
        {
            // ... some code to calculate 'result' ...
            setTextboxText(result); // Error occurs here
        }

        // ... other code ... including setTextboxText method ...
    }
}
ログイン後にコピー
ログイン後にコピー

静的メンバー:
    クラスの特定の
  • インスタンスではなく、class それ自体に属します。 クラスのすべてのオブジェクトが作成される前でも存在します。 非静的なメンバー:クラスのインスタンス
  • インスタンスに属します。 それらにアクセスするには、オブジェクト(インスタンス)が必要です
  • は静的であるため、関連付けられたオブジェクトはありません。 したがって、オブジェクトを動作させる必要があるを直接呼び出すことはできません。
ソリューション:

SumData Form1これを修正する主な方法は2つあります:setTextboxText

1。 static:

を作成します

本質的にインスタンス固有のデータまたは

のメンバーへのアクセスを必要としない場合、静的にすることができます: setTextboxText

注意:

UI関連のメソッドを作成する静的は、スレッドの問題につながり、コードの維持が難しくなる可能性があるため、一般的に推奨されます。 setTextboxTextForm12。非静的な方法(推奨)から

に電話してください:
public static void setTextboxText(int result)
{
    // Code to update the textbox.  This might require accessing the textbox 
    // statically (e.g., if it's a public static member of Form1).  This is often 
    // not ideal for UI elements.
}
ログイン後にコピー

これは、よりクリーンでより一般的なソリューションです。 仲介者として行動するには非静的な方法が必要です:

setTextboxText最良のアプローチは、の呼び出し方法によって異なります。 いくつかの一般的なシナリオは次のとおりです

private void UpdateTextbox(int result)
{
    setTextboxText(result); // This is now safe
}

private static void SumData(object state)
{
    // ... calculate 'result' ...
    // Access the Form1 instance using a delegate or other mechanism
    // (see examples below)
    this.BeginInvoke(new Action(() => UpdateTextbox(result))); //Example using BeginInvoke for UI thread safety
}
ログイン後にコピー
if

Form1のメソッド内から呼び出されている場合、<上記の例に示すように)SumDataを直接使用できます。

SumData

バックグラウンドスレッドまたはタイマーから呼び出されている場合:
    代表者を使用して、クロススレッドの例外を避けるためにUIスレッドにコールバックを元に戻す必要があります:
namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        // ... other code ...

        private static void SumData(object state)
        {
            // ... some code to calculate 'result' ...
            setTextboxText(result); // Error occurs here
        }

        // ... other code ... including setTextboxText method ...
    }
}
ログイン後にコピー
ログイン後にコピー
  • 完全に別々のクラスからSumDataが呼び出されている場合:Form1SumDataインスタンスへの参照をSumDataに渡す方法が必要です。 これには、それを
  • への引数として渡すか、静的フィールドに参照を保存することが含まれます(ただし、合併症の可能性があるため、これは一般にあまり好まれません)。

アプリケーションのコンテキストに最適なソリューションを選択し、UI要素を扱うときは常にスレッドの安全性を優先することを忘れないでください。 非静的な仲介方法と適切なスレッドを使用したオプション2は、一般に最も堅牢で保守可能なソリューションです。

以上が静的方法から非静的な方法を呼び出すのはなぜ「オブジェクト参照が必要です」と呼ぶのですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート