Rumah > pembangunan bahagian belakang > C++ > Mengapa memanggil kaedah bukan statik dari kaedah statik menyebabkan 'rujukan objek diperlukan'?

Mengapa memanggil kaedah bukan statik dari kaedah statik menyebabkan 'rujukan objek diperlukan'?

Susan Sarandon
Lepaskan: 2025-02-02 17:41:11
asal
279 orang telah melayarinya

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

c# error cs0120: rujukan objek diperlukan

Kesalahan ini, "Rujukan objek diperlukan untuk medan, kaedah, atau harta yang tidak statik ...", timbul ketika cuba mengakses ahli bukan statik (seperti

) dari dalam kaedah statik (setTextboxText). Mari kita periksa kod yang disediakan: SumData

<code class="language-csharp">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 ...
    }
}</code>
Salin selepas log masuk
Salin selepas log masuk
Masalahnya terletak pada perbezaan asas antara ahli statik dan bukan statik:

  • ahli statik: tergolong dalam kelas sendiri, bukan kepada mana -mana contoh kelas. Mereka wujud sebelum mana -mana objek kelas dibuat.
  • ahli bukan statik: tergolong dalam contoh kelas. Anda memerlukan objek (contoh) untuk mengaksesnya.
Sejak

adalah statik, ia tidak mempunyai objek yang berkaitan SumData. Oleh itu, ia tidak dapat secara langsung memanggil Form1, yang memerlukan objek untuk beroperasi. setTextboxText

Penyelesaian:

Terdapat dua cara utama untuk membetulkannya:

1. Buat statik: setTextboxText

Jika

tidak semestinya memerlukan akses kepada data khusus atau ahli setTextboxText, anda boleh menjadikannya statik: Form1

<code class="language-csharp">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.
}</code>
Salin selepas log masuk

berhati-hati: Membuat kaedah yang berkaitan dengan UI statik umumnya tidak digalakkan kerana ia boleh membawa kepada isu-isu threading dan menjadikan kod lebih sukar untuk dikekalkan.

2. Hubungi dari kaedah bukan statik (disyorkan): setTextboxText

Ini adalah penyelesaian yang lebih bersih dan lebih biasa. Anda memerlukan kaedah bukan statik untuk bertindak sebagai perantara:

<code class="language-csharp">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
}</code>
Salin selepas log masuk

bagaimana untuk mengakses contoh dalam Form1 (untuk pilihan 2): SumData

Pendekatan terbaik bergantung pada bagaimana

dipanggil. Berikut adalah beberapa senario biasa: SumData

  • jika dipanggil dari dalam kaedah SumData: Form1 anda boleh menggunakan secara langsung (seperti yang ditunjukkan dalam contoh di atas). this

  • Jika dipanggil dari thread latar belakang atau pemasa: SumData Anda perlu menggunakan perwakilan untuk marshal panggilan kembali ke benang UI untuk mengelakkan pengecualian silang:

<code class="language-csharp">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 ...
    }
}</code>
Salin selepas log masuk
Salin selepas log masuk
  • Jika SumData dipanggil dari kelas yang sama sekali berasingan: Anda memerlukan cara untuk lulus rujukan kepada Form1 contoh untuk SumData. Ini boleh melibatkan lulus sebagai hujah untuk SumData atau menyimpan rujukan kepadanya dalam bidang statik (walaupun ini umumnya kurang disukai kerana komplikasi yang berpotensi).

ingat untuk memilih penyelesaian yang paling sesuai dengan konteks aplikasi anda dan sentiasa mengutamakan keselamatan benang ketika berurusan dengan elemen UI. Pilihan 2, menggunakan kaedah perantara bukan statik dan threading yang betul, biasanya merupakan penyelesaian yang paling mantap dan boleh dipelihara.

Atas ialah kandungan terperinci Mengapa memanggil kaedah bukan statik dari kaedah statik menyebabkan 'rujukan objek diperlukan'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan