de-vraag
  • Pertanyaan
  • Tag
  • Pengguna
Notifikasi
Imbalan
Registrasi
Setelah Anda mendaftar, Anda akan diberitahu tentang balasan dan komentar untuk pertanyaan Anda.
Gabung
Jika Anda sudah memiliki akun, masuk untuk memeriksa pemberitahuan baru.
Akan ada hadiah untuk pertanyaan, jawaban, dan komentar tambahan.
Lebih
Sumber
Sunting
 Ian
Ian
Question

Bagaimana untuk menghindari rekursi properti

Ini memukul saya baru-baru ini pada sebuah proyek yang saya kerjakan. Kebanyakan orang yang akrab dengan properti rekursi:

public int Test 
{
   get { return this.test; }
   set { this.Test = value; }
}
private int test;

Anda secara tidak sengaja menempatkan huruf T dalam hal ini setter, dan anda've membuka diri untuk sebuah StackoverflowException. Apa's lebih buruk adalah jika anda've tidak didefinisikan, sering visual studio akan otomatis memperbaiki casing untuk anda untuk keadaan yang tidak valid.

Saya melakukan sesuatu yang serupa namun dalam konstruktor baru-baru ini:

public TestClass(int test)
{
    this.Test = Test;
}

Sayangnya di sini anda don't mendapatkan StackOverflowException, sekarang anda've punya kesalahan pemrograman. Dalam kasus ini nilai yang dilewatkan ke WebService yang bukan digunakan nilai default (yang bukan't 0) yang menyebabkan saya untuk melewatkan fakta aku punya salah yang ditugaskan itu. Integrasi tes semua berlalu karena layanan ini didn't mengatakan

"Hei kau lupa ini benar-benar penting bidang!"

Langkah-langkah apa yang dapat saya ambil untuk menghindari perilaku semacam ini? I've selalu disarankan terhadap mendefinisikan variabel-variabel seperti berikut, dan saya don't seperti mereka secara pribadi, tetapi saya dapat't pikir opsi lain:

private int _test;
private int mTest;

EDIT

Alasan bahwa garis bawah atau m awalan yang tidak diinginkan biasanya yang bisa saya pikirkan adalah:

  • Pembacaan
  • Sedikit lebih sulit untuk menggulir melalui anggota jika anda're mewarisi dari pihak ke-3 kelas sebagai anda mendapatkan campuran gaya.
48 2013-10-30T13:02:53+00:00 5
Taylan Aydinli
Taylan Aydinli
Pertanyaan edit 19 Desember 2013 в 7:14
Pemrograman
recursion
c#
properties
Solution / Answer
Sriram Sakthivel
Sriram Sakthivel
30 Oktober 2013 в 1:13
2013-10-30T13:13:02+00:00
Lebih
Sumber
Sunting
#22666235

Cara terbaik adalah dengan menggunakan "Auto dilaksanakan sifat" di sini.

public int Test { get; set; }

Jika tidak mungkin untuk menggunakan "Auto dilaksanakan sifat" untuk beberapa alasan menggunakan _ awalan(I don't sukai meskipun).

Jika anda juga don't lebih memilih untuk menggunakan beberapa prefiks, maka anda memiliki pilihan lain. Anda don't harus menulis kode properti dengan tangan. Biarkan IDE melakukannya untuk anda; dengan cara itu anda dapat menghindari kesalahan ceroboh. (I don't tahu bagaimana saya ini terjawab di jawaban asli)

Hanya jenis

private int test;

Pilih bidang, klik Kanan Refactor->Merangkum Lapangan. IDE akan menghasilkan properti snippet untuk anda sebagai berikut.

public int Test
{
    get { return test; }
    set { test = value; }
}

Anda don't perlu repot-repot mengklik menu konteks. Jika anda lebih memilih keyboard, shortcut adalah Pilih + R + E.

Atau mendapatkan Resharper, Itu akan mengarahkan anda kesalahan konyol dengan segera.

Sriram Sakthivel
Sriram Sakthivel
Jawaban edit 25 Mei 2015 в 8:43
62
0
 David
David
30 Oktober 2013 в 1:13
2013-10-30T13:13:10+00:00
Lebih
Sumber
Sunting
#22666236

tes Integrasi semua berlalu

Kemudian mereka weren't lengkap tes yang cukup. Jika ada's sebuah kesalahan yang tidak't ditemukan oleh tes, maka anda've got tes lain untuk menulis.

Yang's benar-benar satu-satunya solusi otomatis di sini. Compiler isn't akan mengeluh, karena kode ini secara struktural dan sintaksis yang benar. It's hanya tidak logis benar pada saat runtime.

Anda dapat menentukan penamaan standar, bahkan menggunakan alat-alat seperti StyleCop upaya untuk menegakkan standar-standar tersebut. Yang mungkin akan memungkinkan anda untuk menutupi banyak, meskipun itu's tidak ketat solusi dan kesalahan masih bisa mendapatkan melalui. Secara pribadi saya setuju dengan anda bahwa dekorasi nama-nama variabel adalah sedap dipandang dalam kode. Mungkin dalam beberapa kasus's yang valid tradeoff?

Akhirnya, tes otomatis adalah pertahanan anda terhadap jenis-jenis kesalahan. Pada bentuknya yang paling sederhana, jika kesalahan akan melalui tes dan ke produksi maka respon harus:

  1. Menulis tes untuk mereproduksi kesalahan.
  2. Memperbaiki kesalahan.
  3. Menggunakan tes untuk memvalidasi memperbaiki.

Memang, yang hanya mencakup yang satu kasus, tidak setiap definisi properti di kode anda. Tetapi jika hal ini terjadi banyak maka anda mungkin memiliki masalah personil dan bukan masalah teknis. Seseorang di tim ini, nah, ceroboh. Solusi untuk masalah itu mungkin tidak menjadi salah satu teknis.

33
0
 Slavo
Slavo
30 Oktober 2013 в 2:15
2013-10-30T14:15:40+00:00
Lebih
Sumber
Sunting
#22666238

Menggunakan potongan kode.

Untuk setiap properti yang didukung oleh bidang pribadi, menggunakan custom cuplikan kode yang telah anda buat, bukan menulis itu dari awal atau membiarkan IntelliSense melakukan pekerjaan (buruk).

Setelah semua, masalah ini adalah tentang konvensi dan disiplin, bukan bahasa desain. Kasus sensitif alam C# dan subperfect penyelesaian kode di Visual Studio adalah alasan kami membuat kesalahan-kesalahan ini, bukan kurangnya pengetahuan dan desain.

Anda bertaruh terbaik di sini adalah untuk menghilangkan kemungkinan kecelakaan dan memiliki standar cara penulisan ini berulang-ulang hal-hal dengan benar adalah cara terbaik untuk pergi. Hal ini juga jauh lebih praktis dibandingkan dengan mengingat konvensi dan menegakkan mereka dengan tangan.

Ada default cuplikan kode di Visual Studio untuk ini. Jenis propfull dan tekan Tab, kemudian tentukan contoh nama variabel dan nama properti dan anda're baik untuk pergi.

6
0
 Robert
Robert
30 Oktober 2013 в 7:02
2013-10-30T19:02:31+00:00
Lebih
Sumber
Sunting
#22666239

Dalam beberapa kasus, anda tidak bisa mendapatkan sekitar setter dan getter. Tapi mungkin anda don't perlu setter dan getter jika anda mengikuti Katakan, Don't Meminta prinsip? Itu pada dasarnya mengatakan untuk lebih memilih memiliki objek yang memiliki data melakukan pekerjaan, tidak beberapa objek lain permintaan banyak dari objek data, membuat keputusan, dan kemudian menulis data kembali ke objek data. Lihat http://martinfowler.com/bliki/TellDontAsk.html

3
0
Phil Cooper
Phil Cooper
6 November 2013 в 9:45
2013-11-06T09:45:03+00:00
Lebih
Sumber
Sunting
#22666240

Bisa anda tidak hanya menulis sebuah tes untuk menutupi ini?

int constructorValue = 4;
TestClass test = new TestClass(constructorValue);
Assert.Equals(test.Test, constructorValue);

Anda mungkin tidak ingin untuk menulis tes segera untuk menutupi diri dari masa depan yang bergetar, tetapi anda've menemukan bug, mengapa tidak melindungi diri dari itu lagi?

Sebagai catatan, jika saya membutuhkan field pribadi untuk menyimpan nilai untuk pulic getter/setter, saya selalu menekankan hal ini. Ada's hanya sesuatu yang menggarisbawahi bahwa jeritan privasi!

public string Test
{
    get { return _test; }
    set { _test = value; }
}

private string _test;
2
0
Tambahkan pertanyaan
Kategori
Semua
Teknologi
Budaya / Rekreasi
Kehidupan / Seni
Ilmu Pengetahuan
Profesional
Bisnis
Pengguna
Semua
Baru
Populer
1
Asilbek Qadamboyev
Terdaftar 1 hari yang lalu
2
Akshit Mehta
Terdaftar 4 hari yang lalu
3
me you
Terdaftar 1 minggu yang lalu
4
Никита иванов
Terdaftar 1 minggu yang lalu
5
Alex1976G_06
Terdaftar 1 minggu yang lalu
ID
KO
RU
© de-vraag 2022
Sumber
stackoverflow.com
di bawah lisensi cc by-sa 3.0 dengan atribusi