Rumah >pembangunan bahagian belakang >C++ >Mengapa memanggil kaedah bukan statik dari kaedah statik menyebabkan 'rujukan objek diperlukan'?
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>Masalahnya terletak pada perbezaan asas antara ahli statik dan bukan statik:
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
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>
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
<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>
bagaimana untuk mengakses contoh dalam Form1
(untuk pilihan 2): SumData
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>
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!