Perbandingan bahasa pengaturcaraan java dan c. Lokasi teks sumber dalam fail. Kata Kunci Khas

Sintaks

Kedua-dua bahasa menggunakan bahasa pengaturcaraan C sebagai asas sintaksis. Khususnya, mereka mewarisi daripadanya tanpa perubahan:

  • menandakan permulaan/akhir blok kod dengan pendakap kerinting;
  • tatatanda, perkaitan dan keutamaan kebanyakan operasi terbina dalam (tugasan, aritmetik, logik, bitwise, operasi kenaikan/penurunan, operator bersyarat ternary " ?: »);
  • sintaks untuk menerangkan dan menggunakan pembolehubah dan fungsi (tertib "nama jenis", penggunaan pengubah suai, tanda kurung mandatori untuk fungsi, perihalan parameter formal);
  • sintaks semua pembinaan utama: pengendali bersyarat, gelung, pengendali pilihan berbilang;
  • kekurangan prosedur (ia digantikan oleh fungsi jenis kekosongan);
  • nama jenis asas terbina dalam (kecuali bool, di Jawa jenis ini dipanggil boolean);
  • menggunakan koma bertitik
  • ... dan banyak ciri yang lebih kecil.

Semua ini membawa kepada fakta bahawa program dalam Java dan C# pada pandangan pertama kelihatan sangat serupa dengan program C. Kedua-dua bahasa telah membuat sambungan dan penambahan yang serupa kepada C (atau C++), khususnya, abjad telah diperluaskan dan sintaks mereka sendiri telah diperkenalkan yang menyokong pakej, mengimport perihalan, dan menentukan unit kompilasi.

Terdapat juga banyak perbezaan sintaksis.

Sintaks Jawa C#
Mengimport nama statik
(import statik)
membolehkan anda mengimport secara berasingan beberapa atau semua kaedah statik dan pembolehubah kelas dan menggunakan nama mereka tanpa kelayakan dalam modul pengimportan Hanya perhimpunan diimport dan setiap kali anda menggunakan nama statik yang diimport, anda mesti menentukan kelas
Pemalar dalam penyataan suis mestilah sama ada integer atau jenis enum (dalam 1.7, literal rentetan telah ditambahkan pada senarai jenis) anda boleh menggunakan rentetan teks
pengendali goto mereka sengaja meninggalkan penggunaan goto, bagaimanapun, terdapat mekanisme yang membolehkan anda keluar ke gelung luar dari gelung bersarang dengan menandakannya dengan label dan menggunakan operator break dan continue bersama dengan label (teruskan<метка>;) goto telah bertahan, penggunaan biasa adalah menghantar kawalan kepada label kes yang berbeza dalam pernyataan suis dan keluar dari gelung bersarang
Pemalar Tiada pemalar seperti itu; sebaliknya, pembolehubah kelas statik dengan pengubah akhir digunakan - kesan penggunaannya adalah sama konsep berasingan pemalar ditaip bernama dan kata kunci const
Ketepatan titik terapung Java termasuk binaan strictfp yang menjamin hasil titik terapung yang sama pada semua platform. C# bergantung pada pelaksanaan; tidak ada jaminan keputusan pengiraan yang sama.
Melumpuhkan cek Di Java, semua semakan dinamik didayakan/dilumpuhkan hanya pada peringkat pakej C# mengandungi binaan yang disemak dan tidak disemak yang membolehkan anda mendayakan atau melumpuhkan semakan limpahan aritmetik dinamik secara setempat.

Secara umum, sintaks C# agak lebih luas dan lebih kaya daripada Java; khususnya, ia mengandungi ciri-ciri seperti keupayaan untuk membahagikan perihalan satu kelas kepada beberapa modul, perihalan sifat, dan keupayaan untuk mengawal maya kaedah.

Mekanisme untuk bekerja dengan data dinamik dan pengumpulan sampah

Kedua-dua bahasa melaksanakan model yang sama untuk bekerja dengan data dinamik: objek dibuat secara dinamik menggunakan konstruk baharu, masa jalan memantau kehadiran rujukan kepada mereka, dan pengumpul sampah secara berkala membersihkan memori objek yang tidak mempunyai rujukan. Untuk mengoptimumkan pengumpulan sampah, spesifikasi bahasa dan persekitaran masa jalan tidak mengandungi sekatan pada hayat objek selepas rujukan terakhir kepadanya dipadamkan - pengumpul beroperasi secara bebas daripada pelaksanaan program, jadi pemusnahan sebenar objek objek boleh berlaku pada bila-bila masa selepas rujukan terakhir dipadamkan sehingga program ditamatkan. Pada hakikatnya, pengumpul sampah mengoptimumkan pelaksanaan untuk memastikan penggunaan memori yang boleh diterima sambil meminimumkan kelembapan program.

C# (lebih tepat, masa jalan bahasa biasa) membolehkan anda membatalkan pelaksanaan pemuktamad untuk daripada objek ini kaedah GC.SuppressFinalize(obj) (cth sambungan SQL pada aliran fail). Ini boleh berguna kerana pemuktamadan dianggap sebagai operasi yang agak mahal dalam pengumpulan sampah, dan objek dengan pemuktamad akan hidup lebih lama.

Alat Objek

Jenis enum

Di Jawa, secara tegasnya, hanya tatasusunan satu dimensi boleh diisytiharkan. Tatasusunan multidimensi dalam Java ialah tatasusunan tatasusunan. C# mempunyai kedua-dua tatasusunan berbilang dimensi yang benar dan tatasusunan tatasusunan, yang biasanya dipanggil "bergerigi" dalam C#. Tatasusunan berbilang dimensi sentiasa "segi empat tepat" (bercakap dalam terminologi dua dimensi), manakala tatasusunan tatasusunan boleh menyimpan rentetan dengan panjang yang berbeza (sekali lagi dalam kes dua dimensi, begitu juga dalam kes berbilang dimensi). Tatasusunan berbilang dimensi mempercepatkan akses memori (yang mana penuding dinyahrujuk hanya sekali), manakala tatasusunan bergerigi adalah lebih perlahan tetapi menjimatkan memori apabila tidak semua baris penuh. Tatasusunan berbilang dimensi hanya memerlukan satu panggilan untuk dibuat operator baru, dan yang berperingkat memerlukan secara eksplisit memperuntukkan memori dalam gelung untuk setiap baris.

Jenis berparameter (generik).

Dalam kedua-dua bahasa, jenis boleh diparameterkan, yang menyokong paradigma pengaturcaraan generik. Secara sintaksis, definisi jenis agak hampir - dalam kedua-dua bahasa ia diwarisi daripada templat C++, walaupun dengan beberapa pengubahsuaian.

Jenis generik di Jawa adalah binaan bahasa semata-mata dan hanya dilaksanakan dalam pengkompil. Pengkompil menggantikan semua jenis generik dengan sempadan atasnya dan memasukkan cast jenis yang sesuai di mana sahaja jenis parameter digunakan. Hasilnya ialah bytecode yang tidak mengandungi rujukan kepada jenis generik dan parameternya. Teknik ini untuk melaksanakan jenis generik dipanggil jenis pemadaman(jenis pemadaman). Ini bermakna maklumat tentang jenis generik asal tidak tersedia pada masa jalan dan mengenakan beberapa had, seperti ketidakupayaan untuk mencipta tika tatasusunan baharu daripada hujah jenis generik. Rabu pelaksanaan Java Saya tidak biasa dengan sistem jenis generik, itulah sebabnya pelaksanaan JVM baharu hanya memerlukan kemas kini minimum untuk berfungsi dengan format kelas baharu.

C# pergi ke laluan yang berbeza. Sokongan untuk keluasan telah disepadukan ke dalam masa jalan maya itu sendiri, mula-mula muncul dalam .NET 2.0. Bahasa di sini hanya menjadi antara muka luaran untuk mengakses keupayaan persekitaran ini. Seperti dalam Java, pengkompil melakukan semakan jenis statik, tetapi sebagai tambahan kepada ini, JIT melakukan semakan ketepatan masa beban. Maklumat tentang jenis generik hadir sepenuhnya pada masa jalan dan membenarkan sokongan penuh untuk mencerminkan jenis generik dan penciptaan pelaksanaan baharunya.

Pendekatan Java memerlukan cek tambahan semasa runtime, tidak menjamin bahawa klien kod akan mengikuti jenis surat-menyurat, dan tidak memberikan refleksi untuk jenis generik. Java tidak membenarkan jenis generik dikhususkan kepada jenis primitif (ini hanya boleh dilakukan dengan membungkus jenis primitif dalam kelas), manakala C# menyediakan generik untuk kedua-dua jenis rujukan dan nilai, termasuk primitif. Sebaliknya, Java mencadangkan menggunakan jenis primitif yang dibalut sebagai parameter (cth. List bukannya Senarai ), tetapi ini datang dengan kos peruntukan tambahan ingatan dinamik. Dalam kedua-dua Java dan C#, pengkhususan jenis generik pada jenis rujukan yang berbeza menghasilkan kod yang sama, tetapi untuk C#, masa jalan secara dinamik menjana kod yang dioptimumkan apabila mengkhusus pada jenis nilai (contohnya, Senarai ), yang membolehkannya disimpan dan dikeluarkan daripada bekas tanpa operasi memuatkan dan membuka gulungan.

Pengendalian Acara

Java memerlukan pengaturcara untuk melaksanakan corak pemerhati secara manual, walaupun ia menyediakan beberapa gula sintaksis dalam bentuk kelas bersarang tanpa nama, yang membolehkan anda mentakrifkan badan kelas dan serta-merta membuat seketika pada satu titik dalam kod.

C# menyediakan sokongan peringkat bahasa yang meluas untuk pengaturcaraan acara, termasuk perwakilan .NET, multicasting, sintaks khas untuk menetapkan acara dalam kelas, operasi untuk mendaftar dan menyahdaftar pengendali acara, mewakilkan kovarians dan kaedah tanpa nama dengan set penuh semantik penutup.

Penutupan dicadangkan untuk dimasukkan dalam Java SE 8. Penutupan ini, seperti perwakilan dalam C#, akan mempunyai akses penuh kepada semua pembolehubah tempatan dalam skop tertentu, dan bukannya akses membaca kepada pembolehubah yang ditanda muktamad (seperti dengan kelas bersarang tanpa nama).

Beban operasi

Hartanah

C# menyokong konsep "properties" - medan pseudo kelas yang diakses dengan cara terkawal sepenuhnya dengan mencipta kaedah untuk mendapatkan dan menulis nilai medan. Pengisytiharan harta dibuat menggunakan konstruk get dan set.

C# juga termasuk sesuatu yang dipanggil pengindeks, yang boleh dianggap sebagai kes khas pembebanan operator (serupa dengan lebihan beban operator dalam C++), atau sifat berparameter. Pengindeks ialah harta yang dinamakan ini yang boleh mempunyai satu atau lebih parameter (indeks), dan indeks boleh terdiri daripada sebarang jenis. Ini membolehkan anda membuat kelas yang keadaannya berkelakuan seperti tatasusunan:

Senarai Saya[ 4 ] = 5 ; nama rentetan = xmlNode. Atribut["nama"]; pesanan = customerMap[ theCustomer] ;

Penggunaan sifat tidak disukai oleh beberapa pengaturcara yang bereputasi. Khususnya, Jeffrey Richter menulis:

“Secara peribadi, saya tidak suka sifat dan akan gembira melihat sokongan untuknya dialih keluar daripada Microsoft .NET Framework dan bahasa pengaturcaraan yang berkaitan. Sebabnya ialah sifat kelihatan seperti medan tetapi sebenarnya kaedah."

Mengikuti gaya penamaan C# biasa, nama harta dibezakan secara visual daripada nama medan kerana ia bermula dengan huruf besar.

Penyusunan bersyarat

C#, tidak seperti Java, menyokong kompilasi bersyarat menggunakan arahan prapemproses. Ia juga mempunyai atribut Bersyarat, yang bermaksud bahawa kaedah yang ditentukan hanya dipanggil apabila pemalar kompilasi yang diberikan ditakrifkan. Dengan cara ini, anda boleh memasukkan ke dalam kod, contohnya, semakan penegasan, yang hanya akan berfungsi dalam versi nyahpepijat apabila pemalar DEBUG ditakrifkan. Dalam pustaka standard .NET, ini ialah kaedah Debug.Assert().

Java versi 1.4 dan lebih baru termasuk ciri semakan andaian masa jalan dalam bahasa. Di samping itu, jika binaan dengan keadaan malar boleh dikembangkan pada masa penyusunan. Terdapat pelaksanaan pihak ketiga prapemproses untuk Java, ia digunakan terutamanya apabila membangunkan aplikasi untuk peranti mudah alih.

Ruang nama, perhimpunan, pakej

C# menggunakan ruang nama(ruang nama), mengingatkan mekanisme C++ dengan nama yang sama. Setiap kelas tergolong dalam ruang nama; kelas yang ruang nama tidak dinyatakan secara eksplisit tergolong dalam ruang nama yang tidak dinamakan secara lalai. Ruang nama boleh bersarang antara satu sama lain.

Jawa mempunyai pakej, agak serupa dengan ruang nama C#. Pakej boleh bersarang, setiap kelas yang diterangkan adalah kepunyaan pakej tertentu; jika tiada petunjuk jelas pakej, kelas tersebut tergolong dalam pakej global yang tidak dinamakan.

Dalam kedua-dua bahasa, untuk mengakses objek yang diisytiharkan dalam ruang nama atau pakej lain, anda mesti mengisytiharkan pakej yang diperlukan (ruang nama) dalam program sebagai digunakan. Objek diakses melalui nama yang layak; nama pakej (ruang nama) digunakan sebagai kelayakan. Jika anda perlu menghubungi objek tanpa kelayakan, modul perisian mesti mengandungi arahan dereference: menggunakan dalam C# dan import dalam Java.

Dalam C#, ruang nama tidak dikaitkan dalam apa-apa cara dengan modul yang disusun (himpunan, atau pemasangan dalam istilah Microsoft). Berbilang himpunan boleh mengandungi ruang nama yang sama, dan satu perhimpunan boleh mengisytiharkan berbilang ruang nama, tidak semestinya bersarang. Pengubah suai skop C# tiada kaitan dengan ruang nama. Di Java, kelas yang diisytiharkan dalam pakej yang sama secara lalai membentuk satu modul tersusun. Pengubah suai skop lalai (tiada spesifikasi eksplisit) mengehadkan skop medan dan kaedah kelas kepada sempadan pakej.

Di Java, struktur fail dan direktori kod sumber pakej secara lalai dikaitkan dengan struktur pakej - pakej sepadan dengan direktori, subpakej termasuk di dalamnya - subdirektori direktori ini, fail sumber terletak dalam direktori sepadan dengan pakej atau subpakej di mana ia disertakan. Oleh itu, pokok sumber mengikut struktur pakej. Dalam C#, lokasi fail sumber tiada kaitan dengan ruang namanya.

Lokasi teks sumber dalam fail

Dalam C#, kelas boleh ditempatkan dalam fail dalam apa jua cara. Nama fail kod sumber tiada kaitan dengan nama kelas yang ditakrifkan di dalamnya. Ia dibenarkan untuk meletakkan beberapa kelas awam dalam satu fail. Sejak versi 2.0, C# juga membenarkan anda membahagikan kelas kepada dua atau lebih fail (kata kunci separa). Ciri terakhir digunakan secara aktif oleh alat binaan antara muka visual: bahagian kelas yang mengandungi medan dan kaedah yang dikawal oleh pereka bentuk antara muka dipisahkan ke dalam fail berasingan supaya tidak mengacaukan fail yang diedit terus oleh pengaturcara dengan kod yang dijana secara automatik .

Di Java, setiap fail boleh mengandungi hanya satu kelas awam, dan Java memerlukan nama fail adalah sama dengan nama kelas itu, menghapuskan kekeliruan antara nama fail dan kelas. Selain itu, menurut konvensyen pengekodan yang disyorkan Sun, saiz fail kod sumber tidak boleh melebihi 2000 baris kod, kerana fail yang lebih besar lebih sukar untuk dihuraikan. Saiz besar fail juga dianggap sebagai tanda keputusan reka bentuk yang lemah.

Pengecualian

Kedua-dua bahasa menyokong mekanisme pengendalian pengecualian, direka secara sintaksis dengan cara yang sama: bahasa mempunyai operator penjanaan pengecualian melontar dan blok pengendalian pengecualian cuba()tangkap()()akhirnya(), yang memastikan pemintasan pengecualian yang berlaku dalam blok, pemprosesannya, dan pelaksanaan tindakan akhir yang dijamin.

Java menyokong pengecualian yang diperiksa: pengaturcara mesti menyatakan secara eksplisit untuk setiap kaedah jenis pengecualian yang boleh dilemparkan oleh kaedah, jenis ini disenaraikan dalam pengisytiharan kaedah selepas kata kunci lontaran. Jika kaedah menggunakan kaedah yang membuang pengecualian yang diperiksa, ia mesti sama ada secara eksplisit menangkap semua pengecualian tersebut atau mengandunginya dalam penerangan sendiri. Oleh itu, kod tersebut secara eksplisit mengandungi senarai pengecualian yang boleh dilemparkan oleh setiap kaedah. Hierarki jenis pengecualian juga mengandungi dua jenis (RuntimeException dan Ralat), yang keturunannya tidak disemak dan tidak sepatutnya diterangkan. Ia dikhaskan untuk pengecualian masa jalan yang boleh berlaku di mana-mana atau biasanya tidak boleh dikendalikan oleh pengaturcara (seperti ralat masa jalan), dan tidak boleh dinyatakan dalam perisytiharan lontaran.

C# tidak menyokong pengecualian yang diperiksa. Ketiadaan mereka adalah pilihan yang disengajakan oleh pemaju. Anders Hejlsberg, ketua arkitek C#, percaya bahawa di Jawa mereka sedikit sebanyak satu percubaan dan tidak membenarkan diri mereka sendiri.

Pengaturcaraan selari

Secara umum, mekanisme pengaturcaraan selari dalam C# adalah serupa dengan yang disediakan oleh Java, perbezaannya terletak pada butiran pelaksanaan. Dalam kedua-dua kes, terdapat Benang kelas perpustakaan yang melaksanakan konsep "benang". Java menyediakan dua cara untuk mencipta benang anda sendiri: sama ada dengan melanjutkan kelas Thread atau dengan melaksanakan antara muka Runnable. Dalam kedua-dua kes, pengaturcara mesti mentakrifkan kaedah run() yang diwarisi (termasuk dalam antara muka) yang mengandungi badan benang - kod yang akan dilaksanakan di dalamnya. C# sebaliknya menggunakan mekanisme perwakilan: untuk mencipta benang, contoh kelas Thread standard dicipta, yang mana perwakilan yang mengandungi kaedah - badan benang - diluluskan sebagai parameter pembina.

Kedua-dua bahasa mempunyai keupayaan untuk mencipta blok kod yang dilaksanakan serentak; dalam Java ini dilakukan menggunakan operator synchronized(), dalam C# - dengan operator lock(). Java juga membenarkan anda mengisytiharkan kaedah segerak menggunakan pengubah suai disegerakkan dalam pengepala pengisytiharan kaedah. Kaedah sedemikian, apabila dilaksanakan, sekat objek pemiliknya (oleh itu, kaedah disegerakkan kelas, untuk contoh yang sama, hanya satu boleh dilaksanakan pada satu masa, yang lain akan menunggu). Ciri serupa dalam .NET disediakan oleh MethodImplAttribute MethodImplOptions.Atribut pelaksanaan kaedah yang disegerakkan, tetapi tidak seperti Java, ciri ini bukan sebahagian daripada bahasa C# secara rasmi.

Kedua-dua bahasa juga menyediakan kemudahan penyegerakan yang sama berdasarkan penghantaran dan menunggu isyarat dari satu utas ke yang lain. Di Java ini ialah kaedah notify(), notifyAll() dan wait(), dalam C# ini ialah kaedah Pulse(), PulseAll(), Wait() (tiga kaedah berfungsi secara berpasangan). Satu-satunya perbezaan ialah dalam Java kaedah ini (dan, dengan itu, fungsi monitor) dilaksanakan dalam kelas Objek, jadi tiada perpustakaan tambahan diperlukan untuk penyegerakan, dan dalam C# kaedah ini dilaksanakan sebagai kaedah statik dalam kelas perpustakaan berasingan Monitor . Dalam C# perpustakaan standard Ia juga mengandungi beberapa primitif penyegerakan tambahan untuk pelaksanaan selari benang: mutex, semaphore, pemasa penyegerakan. Sejak versi 1.5, JDK SE telah menyertakan pakej java.util.concurrent, java.util.concurrent.atomic dan java.util.concurrent.locks yang mengandungi set alat yang komprehensif untuk melaksanakan pengkomputeran selari.

Kod tahap rendah

Sehingga kini, tiada komponen persekitaran Java tidak diseragamkan oleh Ecma, ISO, ANSI atau mana-mana yang lain pihak ketiga piawaian. Walaupun Sun Microsystems mengekalkan hak undang-undang eksklusif yang tidak terhad untuk mengubah suai dan melesenkan tanda dagangan Javanya, Sun secara sukarela mengambil bahagian dalam proses yang dipanggil Proses Komuniti Java (JCP), yang membenarkan pihak yang berminat untuk mencadangkan perubahan kepada mana-mana teknologi Sun Java (bahasa, toolkit) , API) melalui perundingan dan kumpulan pakar. Mengikut peraturan JCP, sebarang cadangan untuk perubahan kepada JDK, Java Runtime atau spesifikasi bahasa Jawa mungkin ditolak secara unilateral oleh Sun kerana ia memerlukan undian "ya" daripada Sun untuk diluluskan. JCP memerlukan yuran keahlian daripada ahli komersial, manakala organisasi bukan untung dan individu boleh mengambil bahagian secara percuma.

Lesen

Manakala "Jawa" ialah tanda dagangan Tanda dagangan Sun, dan hanya Sun boleh melesenkan nama "Java", terdapat banyak projek percuma yang sebahagiannya serasi dengan Sun Java. Sebagai contoh, GNU Classpath dan GNU Compiler for Java (GCJ) menyediakan perpustakaan kelas percuma dan pengkompil yang sebahagiannya serasi dengan versi Sun Java semasa. Pada penghujung 2006, Sun mengumumkan bahawa semua kod sumber Java, tidak termasuk kod proprietari yang mereka tidak mengekalkan haknya, akan dikeluarkan sebagai perisian percuma di bawah lesen GPL yang diubah suai menjelang Mac 2007. Sun kini mengedarkan Mesin Maya HotSpot dan pengkompil Java di bawah lesen GPL, tetapi pada masa ini tiada lesen percuma untuk masa jalan Java standard. Oleh kerana Sun akan mengekalkan pemilikan kod sumber Javanya, melepaskannya di bawah GPL tidak akan menghalang Sun daripada mengedarkan versi Java proprietari atau belum dibuka, atau melesenkannya kepada orang lain.

C#, masa jalan CLI, dan kebanyakan perpustakaan kelas yang berkaitan adalah diseragamkan dan boleh dilaksanakan secara bebas tanpa lesen. Beberapa telah pun dilaksanakan sistem percuma C#, termasuk Mono dan DotGNU. Projek Mono juga melaksanakan banyak perkara perpustakaan bukan standard Microsoft dengan mengkaji bahan Microsoft, serupa dengan GNU Classpath dan Java. Projek Mono bertujuan untuk mengelak daripada menceroboh mana-mana paten atau hak cipta, dan projek itu boleh diedarkan dan digunakan secara bebas di bawah lesen GPL. Microsoft pada masa ini mengedarkan -versi masa jalan .NET untuk kegunaan bukan komersial.

Penggunaan

Komuniti

Java dibina di atas budaya yang lebih terbuka dengan firma yang berdaya saing tinggi dalam bidang fungsi yang berbeza. Kebanyakan perpustakaan tambahan tersedia di bawah lesen sumber terbuka percuma. kod sumber. Sun juga menggalakkan amalan menerangkan beberapa fungsi sebagai spesifikasi (lihat proses JCP), menyerahkan pelaksanaan kepada pembangun pihak ketiga (mungkin menyediakan pelaksanaan rujukan). Oleh itu, isu kebebasan daripada pengeluar perisian diselesaikan.

Walaupun wujud Mono, C# mengikat pembangun dengan erat dengan platform Microsoft (termasuk OS penyelesaian pejabat). Oleh itu, pengguna perisian yang ditulis dalam .NET selalunya tiada pilihan dalam menggunakan pelbagai komponen sistem. Ini membawa kepada apa yang dipanggil vendor-locking, di mana pengeluar perisian pihak ketiga boleh menentukan hampir sebarang syarat kepada pembeli untuk menyokong projek yang dilaksanakan. Manakala pengguna aplikasi Java, sebagai peraturan, boleh memilih pembekal perisian tambahan (seperti pangkalan data, OS, pelayan aplikasi, dll.).

Populariti dan pembangunan

Java lebih tua daripada C# dan dibina di atas pangkalan pengguna yang besar dan aktif, menjadi lingua franca Dalam banyak kawasan moden sains komputer, terutamanya yang melibatkan rangkaian. Java mendominasi kursus pengaturcaraan di universiti dan kolej Amerika, dan kini terdapat lebih banyak literatur tentang Java berbanding C#. Kematangan dan populariti Java telah membawa kepada lebih perpustakaan dan API dalam Java (kebanyakannya adalah sumber terbuka) daripada dalam C#.

Tidak seperti Java, C# ialah bahasa yang agak baharu. Microsoft belajar bahasa sedia ada, seperti Java, Delphi dan Visual Basic, dan menukar beberapa aspek bahasa agar lebih sesuai dengan keperluan jenis aplikasi tertentu.

Satu kritikan yang boleh didengar tentang Java ialah ia lambat untuk dibangunkan dan kekurangan beberapa ciri yang menjadikan corak dan metodologi pengaturcaraan bergaya lebih mudah. Kritikan terhadap bahasa C# ialah pembangunnya mungkin terlalu bersemangat untuk menampung aliran pengaturcaraan semasa dengan mengorbankan tumpuan dan kesederhanaan bahasa tersebut. Jelas sekali, pereka Java telah mengambil pendekatan yang lebih konservatif untuk menambah ciri baharu utama pada sintaks bahasa berbanding bahasa moden yang lain—mungkin tidak mahu menggunakan bahasa itu kepada aliran yang mungkin membawa kepada jalan buntu dalam jangka masa panjang. Dengan keluaran Java 5.0, aliran ini sebahagian besarnya rosak, kerana ia memperkenalkan beberapa ciri baharu utama bahasa: gelung foreach, pembungkusan automatik, kaedah dengan nombor berubah-ubah parameter, jenis terbilang, jenis generik dan anotasi (semuanya terdapat dalam C#).

C#, seterusnya, berkembang dengan lebih pantas, mengehadkan dirinya lebih kurang dalam menambah ciri khusus masalah baharu. Aliran ini amat ketara dalam versi C# 3.0, di mana, sebagai contoh, pertanyaan seperti SQL muncul. (Ciri-ciri baharu dibina sedemikian rupa sehingga bahasa itu kekal sebagai bahasa tujuan am. Untuk maklumat lanjut tentang C# 3.0, lihat artikel tentang C#). Penambahan berorientasikan masalah kepada Java telah dipertimbangkan, tetapi sekurang-kurangnya sehingga kini, telah ditolak.

Pasaran

Sejak penubuhannya, C# sentiasa dibandingkan dengan Java. Tidak dapat dinafikan bahawa C# dan CLR terurusnya banyak berhutang kepada Java dan JREnya (Java Runtime Environment).

Ia boleh dipertikaikan sama ada pembangunan C# dalam beberapa cara adalah hasil daripada pengiktirafan Microsoft bahawa persekitaran kod terurus, dengan Java mendahului, mempunyai banyak kelebihan dalam dunia yang semakin rangkaian, terutamanya dengan kemunculan Internet pada peranti selain daripada komputer peribadi, dan dengan kepentingan keselamatan rangkaian yang semakin meningkat. Sebelum C# dicipta, Microsoft mengubah suai Java (mencipta J++) untuk menambah ciri yang hanya berfungsi pada Windows, dengan itu memecahkan perjanjian Lesen Sistem Mikro Matahari. Semasa Microsoft berada dalam fasa kedua strategi perniagaannya, yang dikenali sebagai "Embrace, Extend, and Extinguish", pembangunan J++ telah dihentikan oleh tuntutan mahkamah yang difailkan oleh Sun. Tidak dapat membangunkan klon Java dengan ciri yang dikehendakinya, Microsoft mencipta alternatif yang lebih sesuai dengan keperluan dan visi mereka untuk masa hadapan.

Walaupun permulaan yang bergelora ini, semakin jelas bahawa dua bahasa jarang bersaing antara satu sama lain di pasaran. Java menguasai sektor mudah alih dan mempunyai ramai pengikut dalam pasaran aplikasi web. C# telah mendapat penerimaan yang baik dalam pasaran aplikasi desktop Windows dan terima kasih kepada ASP.NET, C# juga merupakan pemain dalam pasaran aplikasi web.

Aplikasi Desktop

Kedua-dua bahasa mempunyai satu set perpustakaan yang menyediakan keupayaan antara muka pengguna untuk aplikasi desktop. Dalam kes Java, ini ialah perpustakaan berbilang platform Swing dan SWT, serta beberapa perpustakaan yang kurang biasa. Pada dasarnya, mana-mana daripada mereka membolehkan anda membuat aplikasi desktop merentas platform di Java.

Untuk C# pada platform Windows, perpustakaan utama yang melaksanakan GUI pengguna dalam aplikasi desktop ialah Windows.Forms, dimiliki oleh Microsoft dan dilaksanakan hanya untuk Windows, dan untuk platform lain - gtk#, dilaksanakan sebagai sebahagian daripada projek Mono. Percubaan untuk melaksanakan Windows secara bebas. Borang telah dan sedang dibuat (contohnya, dalam projek DotGNU), namun, disebabkan sifat tertutup asal, mereka pasti mengalami masalah sekunder dan tidak lengkap, hampir tidak dapat bersaing dengan pelaksanaan daripada Microsoft dan oleh itu hanya boleh digunakan untuk pengalihan tertunda aplikasi Windows ke platform lain. Pembangunan yang berasaskan Windows secara asli biasanya dibina pada Windows.Forms, dan mengalihkannya ke platform lain menjadi sukar. Pembangunan C# dalam Mono menggunakan gtk# adalah mudah alih, tetapi terdapat lebih sedikit daripada mereka.

Oleh kerana sifat bahasa, penggunaan manual perpustakaan grafik Java agak lebih sukar. Seni bina perpustakaan grafik Java lebih sukar difahami oleh pembangun pemula, tetapi pada masa yang sama, ia memaksanya untuk membangun secara profesional. C#, disebabkan kehadiran alat pengaturcaraan acara terbina dalam, menyembunyikan butiran pemprosesan acara dan beberapa aspek lain daripada pembangun, memudahkan pembangunan antara muka. Platform .NET pada mulanya menggunakan pembina antara muka visual secara meluas. Semua ini memungkinkan untuk membangunkan antara muka dengan cepat untuk aplikasi desktop dengan kelayakan pengaturcara yang rendah.

Sejak beberapa tahun kebelakangan ini, Sun Microsystems telah menumpukan pada memperkenalkan Java dengan lebih meluas ke dalam pasaran aplikasi desktop. Dalam versi platform JRE 6 (2006), penekanan diberikan pada penambahbaikan interaksi dengan persekitaran grafik pengguna. Versi terbaru Sun's JVM (kemas kini JDK 6 10) termasuk banyak penambahbaikan pada antara muka pengguna. Khususnya, bentuk telus dan tingkap bukan segi empat tepat. Versi terbaru Java IDE (cth. NetBeans) juga termasuk pembina antara muka pengguna grafik yang dipertingkatkan dengan ketara.

C#, bersama-sama dengan Java, secara beransur-ansur menjadi popular pada beberapa sistem pengendalian berasaskan Linux dan BSD. Melaksanakan projek Mono merupakan proses yang tidak menyakitkan dari segi undang-undang kerana bahasa CLR dan C# diseragamkan oleh Ecma dan ISO, dan sesiapa sahaja boleh melaksanakannya tanpa perlu risau tentang isu undang-undang. Pada masa yang sama, perlu diperhatikan bahawa permohonan yang ditulis di bawah Persekitaran Windows mungkin mempunyai masalah besar berjalan di bawah OS lain.

Aplikasi pelayan

Dalam arena ini, mungkin kedua-dua bahasa itu paling hampir untuk dianggap sebagai pesaing. Java dengan platform J2EE (Java(2) Enterprise Edition) dan C# dengan ASP.NET bersaing dalam bidang mencipta kandungan dan aplikasi web dinamik.

Kedua-dua bahasa digunakan dan disokong secara meluas dalam pasaran ini, bersama-sama dengan set alatan dan produk sokongan yang tersedia untuk JavaEE dan .NET.

Aplikasi mudah alih

J2ME (JavaME, Java(2) Edisi Mikro) mempunyai pangkalan yang sangat luas dalam pasaran telefon mudah alih dan PDA, di mana hanya peranti murah kekurangan KVM (Mesin Maya Java yang dilucutkan untuk peranti dengan sumber terhad). Program Java, termasuk banyak permainan, terdapat di mana-mana.

Walaupun hampir semua telefon termasuk KVM, keupayaan ini tidak digunakan dengan banyak oleh kebanyakan pengguna. Aplikasi Java pada kebanyakan telefon biasanya terdiri daripada sistem menu, permainan kecil dll. Aplikasi penuh untuk telefon bimbit jarang berlaku.

berteknologi tinggi

C Tajam- Istilah ini mempunyai makna lain, lihat C. Tajuk yang betul bagi artikel ini ialah C#. Ia ditunjukkan secara salah kerana had teknikal. C# Semantik: Kelas bahasa imperatif: pelbagai paradigma: berorientasikan objek,... ... Wikipedia

Visual J Sharp- Tajuk betul artikel Visual J# ini. Ia ditunjukkan secara tidak betul kerana batasan teknikal. Visual J# ialah persekitaran pembangunan bersepadu yang dicipta oleh Microsoft untuk Rangka Kerja .NET dalam bahasa seperti Java. Terutamanya... ... Wikipedia

F Tajam- Istilah ini mempunyai makna lain, lihat F (makna). Tajuk yang betul untuk artikel F# ini. Ia ditunjukkan secara tidak betul kerana batasan teknikal. F# Kelas bahasa: pelbagai paradigma: berfungsi, berorientasikan objek, ... ... Wikipedia

Nyanyi Sharp- Tajuk yang betul untuk artikel ini ialah Sing#. Ia ditunjukkan secara tidak betul kerana batasan teknikal. Sing# Kelas bahasa: pelbagai paradigma: struktur, imperatif, berorientasikan objek, berorientasikan peristiwa, berfungsi, ... ... Wikipedia

M.C. Sharp- MC# (dibaca sebagai “MC Sharp”, mcsharp), bahasa pengaturcaraan C# berbilang pemproses. MC# ialah bahasa pengaturcaraan selari berorientasikan objek peringkat tinggi untuk platform .NET yang menyokong penciptaan program yang dijalankan dalam ... ... Wikipedia

Visual C Sharp

Visual C Sharp .NET- Microsoft Visual Studio Penampilan Visual Studio 2008 SP1 dengan program dalam C# dalam persekitaran pembangunan Perisian Jenis Windows Vista ... Wikipedia

ECMAScript- Kelas bahasa: pelbagai paradigma: berorientasikan objek, generik, berfungsi, imperatif, berorientasikan aspek, berorientasikan peristiwa, pengaturcaraan prototaip Muncul pada: 1995 Pengarang ... Wikipedia

Jawa lwn. C#... Apa yang lebih baik daripada pertikaian abadi? Tidak, artikel ini tidak dikhaskan untuk penanda aras lain, dan bukan juga perang suci, bahkan tidak ada soalan: "siapa yang lebih keren".

Terdapat alat untuk setiap tugas. Membandingkan C# dan Ruby, sebagai contoh, tidak masuk akal, kerana tujuan yang dimaksudkan adalah berbeza sama sekali, dan begitu juga sifat mereka. Walau bagaimanapun, C# dan Java yang paling hampir dalam falsafah mereka.

Selalunya, rakan sekerja yang menulis dalam Java tidak menyedari banyak perkara (!!!) yang C# sediakan (atau, sebaliknya, tidak sediakan).

Jika anda berminat untuk melihat C# dan Java tanpa subjektiviti, dan juga mengetahui struktur dalaman peluang ini atau itu, kemudian teruskan.

▌ Sedikit sejarah

Bahasa C# muncul pada tahun 2001, dan perkembangannya bermula pada tahun 1999. Pada masa itu ia sangat serupa dengan Java 1.4. Walau bagaimanapun, C# moden seperti yang kita tahu ia harus bermula dengan versi 2.0 (yang sepadan dengan keluaran Java 5).

Terdapat pendapat bahawa C # banyak meminjam daripada Java. Walau bagaimanapun, saya sangat tidak bersetuju dengan ini. Pada pendapat saya, C# dalam banyak cara adalah C "dengan objek," atau C++ "dengan wajah manusia."

Saya berharap artikel dan hujah di dalamnya akan mengesahkan kenyataan ini.
Saya tidak akan menceritakan semula Wikipedia. Oleh itu, mari kita teruskan dan teruskan perbezaan utama dan faedah.

Pertama, kita akan melihat keupayaan JVM dan CLR (Common Language Runtime) itu sendiri, kemudian kita akan melihat gula sintaksis C#.

▌ Episod I: Bytecode

Kedua-dua .NET dan Java menggunakan bytecode. Sudah tentu, selain format itu sendiri, terdapat satu perbezaan yang sangat penting - polimorfisme.

CIL (Bahasa Perantaraan Biasa, juga dikenali sebagai MSIL, juga dikenali sebagai IL) ialah bytecode dengan arahan polimorfik (umum).

Jadi, jika di Jawa ia digunakan arahan berasingan bagi setiap jenis operasi dengan pelbagai jenis(Sebagai contoh: fadd- penambahan 2 pelampung, saya tambah– penambahan 2 integer), maka dalam CIL untuk setiap jenis operasi hanya terdapat satu arahan dengan parameter polimorfik (sebagai contoh, hanya terdapat satu arahan – Tambah, yang menambah kedua-dua terapung dan integer). Keputusan untuk menjana arahan x86 yang sesuai terletak pada JIT.

Bilangan arahan untuk kedua-dua platform adalah lebih kurang sama. Membandingkan senarai perintah bytecode Java dan CIL, anda dapat melihat bahawa 206 adalah untuk Java, dan 232 adalah untuk CIL, tetapi jangan lupa bahawa dalam Java banyak arahan hanya mengulangi fungsi satu sama lain.

▌ Episod III: Generik (jenis berparameter || polimorfisme berparameter)

Seperti yang anda ketahui, Java menggunakan mekanisme pemadaman jenis, i.e. sokongan untuk generik hanya disediakan oleh pengkompil, tetapi bukan oleh masa jalan, dan selepas penyusunan, maklumat tentang jenis itu sendiri tidak akan tersedia.

Sebagai contoh, kod:

Senaraikan strList = ArrayList baharu (); Senaraikan intList = ArrayList baharu (); bool areSame = strList.getClass() == intList.getClass(); System.out.println(sama);
Akan dipaparkan benar.

Selain itu, bukannya jenis umum T contoh objek jenis dicipta java.lang.Object.

Senaraikan strList = ArrayList baharu (); strList.add("stringValue"); String str = strList.get(0);
Akan ditukar kepada:

Senarai senarai = new ArrayList(); list.add("stringValue"); Rentetan x = (String) list.get(0);
Jadi polisi keselamatan jenis keseluruhan musnah serta merta.

NET, sebaliknya, mempunyai sokongan penuh generik kedua-dua masa kompilasi dan masa jalan.

Jadi apa yang perlu dilaksanakan untuk menyokong sepenuhnya generik di Jawa? Sebaliknya, mari kita lihat apa yang dilakukan oleh pasukan pembangunan .NET:

  • Sokongan Generik pada peringkat Sistem Jenis Biasa untuk kebolehoperasian merentas bahasa
  • Sokongan penuh daripada Reflection API
  • Menambah kelas/kaedah baharu pada kelas asas (Perpustakaan Kelas Asas)
  • Perubahan dalam format itu sendiri dan jadual metadata
  • Perubahan dalam algoritma peruntukan memori masa jalan
  • Menambah struktur data baharu
  • Sokongan generik daripada JIT (perkongsian kod)
  • Perubahan dalam format CIL (arahan bytecode baharu)
  • Sokongan pengesah kod CIL
Itu. generik tersedia bukan sahaja pada masa penyusunan, tetapi juga pada masa jalan tanpa kehilangan atau menukar maklumat jenis. Keperluan untuk boxing/unboxing juga semakin hilang.

▌ Episod IV: Jenis

Java ialah bahasa OO sepenuhnya. Ini boleh dipertikaikan. Inilah sebabnya: jenis primitif (integer, float, dll.) tidak diwarisi daripada java.lang.Object. Oleh itu, generik dalam Java tidak menyokong jenis primitif.

Tetapi dalam bahasa yang benar-benar OO semuanya adalah objek.

Ini bukan satu-satunya batasan. Ia juga tidak mungkin untuk mencipta jenis primitif anda sendiri.

C# membolehkan anda melakukan ini. Nama struktur ini ialah struct.

Sebagai contoh:

Kuad struktur awam ( int X1; int X2; int Y1; int Y2; )
Juga, generik dalam C# membolehkan anda menggunakan jenis nilai (int, float, dll.)

Jika dalam Java anda perlu menulis seperti ini:

Senaraikan intList = ArrayList baharu ();
Tetapi anda tidak boleh melakukan ini:

Senaraikan intList = ArrayList baharu ();
C# membenarkan penggunaan jenis primitif.

Sekarang kita sampai kepada topik hierarki jenis dalam .NET.

Terdapat 3 jenis jenis dalam .NET: jenis nilai, rujukan dan penunjuk.

Jadi, jenis nilai– analog jenis primitif dari Jawa. Walau bagaimanapun, ia diwarisi daripada Sistem.Objek, hidup bukan pada timbunan, tetapi pada timbunan (dan kini penafian: lokasi jenis nilai bergantung pada kitaran hayatnya, contohnya, apabila mengambil bahagian dalam penutupan, tinju berlaku secara automatik).

Jenis rujukan– adalah sama seperti jenis rujukan dalam Java.

Jenis penunjuk– adalah harta yang paling luar biasa bagi .NET. Hakikatnya ialah CLR membolehkan anda bekerja dengan penunjuk secara langsung!

Sebagai contoh:

Struct Point ( public int x; public int y; ) tidak selamat statik void PointerMethod() ( Point point; Point* p = p->x = 100; p->y = 200; Point point2; Point* p2 = (*p2 ).x = 100; (*p2).y = 200; )
Kelihatan seperti kod C++, bukan?

▌ Episod V: Ciri C#

Pertama, mari kita tentukan apa yang boleh dilakukan oleh C#:
  • Sifat (termasuk automatik)
  • Perwakilan
  • Peristiwa
  • Kaedah tanpa nama
  • Ungkapan Lambda
  • Pokok Ekspresi
  • Kelas tanpa nama
  • Inferens jenis berkuasa
  • Operator lebih muatan
  • Pengindeks
  • ...banyak lagi
Hartanah dalam C# mereka mewakili gula sintaksis, kerana apabila disusun, mereka bertukar menjadi kaedah jenis DapatkanXXX, TetapkanXXX. Walau bagaimanapun, maklumat tentang sifat konsep itu sendiri disimpan dalam metadata, jadi daripada mana-mana sifat bahasa sokongan lain kami hanya boleh mengaksesnya sebagai objek.PropertyX, tetapi tidak objek.GetPropertyX.

Sebagai contoh:

TestClass kelas awam ( public int TotalSum ( get ( return Count * Price; ) ) //sifat automatik - pengkompil akan menjana medan itu sendiri public int Count ( get; set; ) public int Price ( get ( return 50; ) ) )
Ia akan ditukar kepada:

TestClass kelas awam ( /* *semua kod lain */ private int k__BackingField; //automatic property - pengkompil akan menjana medan itu sendiri public int Count ( get ( return k__BackingField; ) set ( k__BackingField = nilai; ) ) )
Perwakilan adalah analog penunjuk kepada kaedah dalam C/C++. Walau bagaimanapun, mereka jenis selamat. Tujuan utamanya ialah fungsi panggil balik, serta bekerja dengan acara.

Pada masa yang sama, perwakilan dalam .NET adalah kemudahan yang lengkap.

Pendekatan ini pada asasnya berbeza daripada projek Da Vinci untuk Java, kerana dalam yang terakhir mereka cuba mengembangkan VM itu sendiri.

Mari lihat contoh dalam C#:

TestClass kelas awam ( perwakilan awam int BinaryOp(int arg1, int arg2); public int Add(int a, int b) ( return a + b; ) public int Multiply(int first, int second) ( return first * second; ) public void TestDelegates() ( BinaryOp op = new BinaryOp(Add); int result = op(1, 2); Console.WriteLine(result); //akan mengeluarkan: 3 op = BinaryOp baharu(Multiply); result = op( 2 , 5); Console.WriteLine(hasil); //akan mengeluarkan: 10 ) )
Dan juga dalam C:

Int Add(int arg1, int arg2) ( return arg1 + arg2; ) void TestFP() ( int (*fpAdd)(int, int); fpAdd = //penunjuk fungsi int tiga = fpAdd(1, 2); / / panggil fungsi melalui penunjuk)
Jadi apa yang kita nampak? Jika dalam C kita boleh menghantar penunjuk ke fungsi dengan jenis parameter lain (katakan float arg1, float arg2), maka dalam C# ini adalah mustahil. Dalam C#, perwakilan menjalani bukan sahaja semakan tandatangan dan jenis pada peringkat penyusunan, tetapi juga semasa runtime.

Peristiwa diperlukan untuk melaksanakan pengaturcaraan dipacu peristiwa. Sudah tentu, anda boleh bertahan dengan corak EventDispatcher atau Penerbit/Pelanggan. Walau bagaimanapun, sokongan bahasa ibunda memberikan kelebihan yang ketara. Salah satunya ialah jenis keselamatan.

Sebagai contoh:

MyClass kelas awam ( private string _value; public delegate void ChangingEventhandler(string oldValue); public event ChangingEventhandler Changing; public void OnChanging(string oldvalue) ( ​​​​ChangingEventhandler handler = Changing; if (handler != null) handler(oldvalue); ) rentetan awam Nilai ( dapatkan ( return _value; ) set ( OnChanging(_value); _value = value; ) ) public void TestEvent() ( MyClass instance = new MyClass(); instance.Changing += new ChangingEventhandler(instance_Changing);instance. Nilai = "nilai rentetan baharu"; //будет вызван метод instance_Changing } void instance_Changing(string oldValue) { Console.WriteLine(oldValue); } } !}
Kaedah tanpa nama memudahkan kehidupan dengan ketara - struktur kelas kekal bersih, i.e. tidak perlu mencipta kaedah tambahan yang berasingan dalam kelas itu sendiri.

Mari ubah suai contoh di atas dengan operasi binari menggunakan kaedah tanpa nama:

TestClass kelas awam ( wakil awam int BinaryOp(int arg1, int arg2); public void TestDelegates() ( BinaryOp op = new BinaryOp(delegate(int a, int b) ( return a + b; )); int result = op( 1, 2); Console.WriteLine(hasil); //akan mengeluarkan: 3 ) )
Bukankah ia lebih pendek dan lebih bersih?

Sekarang mari kita pertimbangkan ungkapan lambda.

Ungkapan lambda ialah fungsi tanpa nama yang mengandungi ungkapan dan pengendali dan juga boleh digunakan untuk membuat perwakilan atau pepohon ungkapan.

TestClass kelas awam ( perwakilan awam int BinaryOp(int arg1, int arg2); public void TestDelegates() ( BinaryOp op = new BinaryOp((a, b) => a + b); int result = op(1, 2); Console.WriteLine(hasil); //akan mengeluarkan: 3 ) )
Apakah rupa contoh dengan acara? Sangat ringkas:

MyClass kelas awam ( /* * semua kod lain */ public void TestEvent() ( MyClass instance = new MyClass(); instance.Changing += (o) => Console.WriteLine(o); instance.Value = "(! LANG:nilai rentetan baharu"; //будет вызван Console.WriteLine } } !}
Nah, kami telah mengurangkan lebih banyak lagi kod dan ia mula kelihatan seperti gaya berfungsi (!!!). Ya, C# juga begitu bahasa berfungsi, kerana fungsi ialah objek kelas pertama.

Ekspresi Lambda, dan dengannya pokok ekspresi, dicipta dengan LINQ(Pertanyaan Bersepadu Bahasa).

Masih tidak biasa dengan LINQ? Ingin melihat bagaimana rupa MapReduce yang terkenal pada LINQ?

Kelas statik awam MyClass ( public void MapReduceTest() ( var words = new ("...beberapa teks pergi ke sini..."); var wordOccurrences = perkataan .GroupBy(w => w). Pilih(perantara => baru ( Perkataan = perantaraan.Kunci, Kekerapan = perantaraan.Jumlah(w => 1) ) .Di mana(w => w.Kekerapan > 10) .PesanBy(w => w.Kekerapan); ) )
Atau gunakan sintaks seperti SQL:

Public void MapReduceTest() ( rentetan perkataan = rentetan baharu ( "...beberapa teks pergi ke sini..." ); var wordOccurrences = daripada w dalam kumpulan perkataan w oleh w ke perantaraan pilih baharu ( Word = perantaraan.Kekunci, Frekuensi = perantaraan.Jumlah((rentetan w) => 1) ) menjadi w dengan w. Kekerapan > 10 tertib mengikut w. Kekerapan pilih w; )
Dalam contoh ini kita melihat kedua-dua kelas LINQ (GroupBy().Select().Where(), dsb.) dan tanpa nama -

Baharu ( Word = perantaraan.Kunci, Kekerapan = perantaraan.Jumlah(w => 1) )
Hmm...apa lagi yang digunakan di sini? Jawapannya mudah - sistem inferens jenis yang berkuasa.

Kata kunci di sini memainkan peranan utama var. C++11 mempunyai reka bentuk yang serupa auto.

Jadi tanpa jenis inferens kita perlu menulis seperti ini:

Public void MapReduceTest() ( rentetan perkataan = rentetan baharu ( "...sesetengah teks pergi ke sini..." ); var wordOccurrences = Enumerable.OrderBy(Enumerable.Where(Enumerable.Select(Enumerable.GroupBy (perkataan, wakil (rentetan w) ( kembali w; )), wakil (IGrouping perantaraan) ( kembalikan baharu ( Word = perantaraan.Kekunci, Kekerapan = Terbilang. Jumlah (perantaraan, (Fungsi ) (w => 1)) ); )), perwakilan (<>f__AnonymousType0 w) ( kembali w. Kekerapan > 10; )), wakilkan (<>f__AnonymousType0 w) ( kembali w.Kekerapan; )); )
[Kaedah ini pengkompil yang dihasilkan untuk kami]

Untuk menerangkan semua ciri lain C#, tetapan pengkompilnya, dsb. Ia adalah perlu untuk menumpukan lebih daripada satu artikel.

Sementara itu, C# 5 – yang sudah tersedia dan akan dikeluarkan secara rasmi tidak lama lagi, tambah pengaturcaraan tak segerak , yang turut muncul dalam C++11!

▌ Kesimpulan

C# dan Java ialah bahasa yang berkuasa, serta platform yang berkuasa (.NET dan Java). Seperti yang telah saya tulis pada permulaan artikel, terdapat alat untuk setiap tugas.

C# bukan kesinambungan atau salinan Java. Walaupun ia sedang dibangunkan di Microsoft, nama kodnya ialah COOL (Bahasa Berorientasikan Objek seperti C). Berapa kali analogi C/C++ telah dipetik dalam artikel ini? Kuantiti yang mencukupi.

Saya harap artikel saya membantu menyelesaikan (sekurang-kurangnya sedikit) isu perbezaan antara bahasa dan platform.

Terima kasih kerana memberi perhatian!

Dan pelepasan memori tidak dinyatakan secara eksplisit. Kedua-duanya termasuk mekanisme penyegerakan dalam sintaks mereka.

Kedua-dua Java dan C# mempunyai rujukan objek yang kuat dan lemah. Java membolehkan anda mendaftarkan pendengar yang akan menerima mesej apabila pautan dikumpul sampah, yang meningkatkan prestasi WeakHashMap, yang tidak wujud dalam C#. Kedua-dua bahasa membenarkan kod pengguna dilaksanakan apabila objek dikumpul sampah. Dalam C#, mekanisme untuk ini ialah kaedah pemuktamad khas, dinyatakan melalui sintaks pemusnah C++ yang biasa. Di Jawa, ini dicapai dengan mengatasi kaedah akhir, yang diisytiharkan dalam kelas Objek.

Jenis data

Kedua-dua bahasa menyokong idea (dikenali dalam C# sebagai jenis nilai - jenis nilai), dan kedua-duanya untuk menterjemah jenis primitif kepada jenis objek menyediakan "pembungkusan" automatik mereka ke dalam objek (tinju) dan "membuka" (membuka kotak). C# mempunyai lebih banyak jenis primitif daripada Java, dengan jenis integer tidak bertanda tersedia secara berpasangan dengan semua yang ditandatangani, dan jenis perpuluhan khas untuk pengiraan titik terapung berketepatan tinggi. Java telah meninggalkan kebanyakan jenis yang tidak ditandatangani demi kesederhanaan. Khususnya, Java tidak mempunyai jenis bait tak bertanda primitif.

Simbol dan ciri khas

Java mempunyai sintaks statik import khas yang membolehkan anda menggunakan nama yang dipendekkan untuk beberapa atau semua kaedah dan pembolehubah statik kelas. C# mempunyai sintaks kelas statik yang mengehadkan kelas kepada sahaja menggunakan kaedah statik, tetapi tidak ada cara untuk menentukan kaedah ini sahaja tanpa menyatakan kelas secara eksplisit setiap kali.

Kata Kunci Khas

Kata kunci Peluang, contoh penggunaan
dapatkan, tetapkan Sintaks C# menyokong .
keluar, ruj C# menyokong parameter output kaedah, membolehkan anda mengembalikan berbilang nilai.
suis Dalam C#, pernyataan suis juga berfungsi pada rentetan.
strictfp Java menggunakan strictfp untuk memastikan bahawa hasil operasi titik terapung tidak berubah merentasi semua platform.
disemak, tidak disemak Dalam C#, ungkapan atau blok yang disemak boleh termasuk pemeriksaan limpahan aritmetik pada masa berjalan.
menggunakan Kata kunci menggunakan dalam C#"s memastikan bahawa objek yang dicipta dilupuskan atau ditutup apabila keluar: menggunakan (Fail StreamWriter = new StreamWriter("test.txt")) ( file.Write("test"); )
pergi ke C# menyokong pengendali lompat. Ia kadangkala boleh berguna, walaupun kaedah pemindahan kawalan yang lebih berstruktur biasanya disyorkan (sebab itu ia ditinggalkan di Jawa). Penggunaan biasa kata kunci goto dalam C# adalah untuk memindahkan kawalan ke label kes yang berbeza dalam pernyataan suis. suis(warna) ( case Color.Blue: Console.WriteLine("Color is blue"); break; case Color.DarkBlue: Console.WriteLine("Color is dark"); goto case Color.Blue; // ... )

Pengendalian Acara

Java memerlukan pengaturcara untuk melaksanakan secara manual corak pemerhati, walaupun ia menyediakan beberapa dalam bentuk tanpa nama, yang membolehkan anda mentakrifkan badan kelas dan segera mencipta contoh pada satu titik dalam kod. Ciri ini biasanya digunakan untuk mencipta pemerhati.

C# menyediakan sokongan peringkat bahasa yang meluas untuk pengaturcaraan acara, termasuk perwakilan .NET, multicasting, sintaks khas untuk menetapkan acara dalam kelas, operasi untuk mendaftar dan menyahdaftar pengendali acara, mewakilkan kovarians dan kaedah tanpa nama dengan semantik penuh.

Penutupan dicadangkan untuk dimasukkan ke dalam Java SE 7. Penutupan ini, seperti perwakilan dalam C#, akan mempunyai akses penuh kepada semua pembolehubah tempatan dalam skop tertentu, dan bukannya akses membaca kepada pembolehubah yang ditanda muktamad (seperti dengan kelas bersarang tanpa nama).

Beban operasi

C# termasuk satu set besar kemudahan notasi, kebanyakannya, seperti operator overloading dan user-defined , biasa kepada pengaturcara C++. Ia juga mempunyai pelaksanaan kaedah antara muka yang jelas, yang membolehkan kelas melaksanakan kaedah antara muka secara berasingan daripada kaedahnya sendiri atau menyediakan pelaksanaan yang berbeza kaedah nama yang sama kepunyaan dua antara muka yang berbeza.

Java tidak menyertakan lebihan muatan pengendali kerana penyalahgunaannya boleh membawa kepada kod yang sukar dibaca dan sukar untuk dinyahpepijat. Pada masa yang sama, kekurangan lebihan dalam Java menjadikannya tidak banyak digunakan untuk beberapa program matematik.

Kaedah

Dalam C#, kaedah tidak lalai dan mesti diisytiharkan secara eksplisit dengan kata kunci maya untuk berbuat demikian. Di Jawa, sebaliknya, semua kaedah awam, kecuali kaedah statik, adalah maya. Kata kunci akhir Java ialah analog yang dimeterai dalam C# dan membolehkan anda melarang penciptaan kaedah dengan tandatangan yang sama dalam kelas terbitan. Maya menjamin pertindihan yang diingini untuk kaedah yang dipanggil, tetapi mengenakan beberapa overhed pelaksanaan pada panggilan, kerana panggilan ini biasanya tidak menjalani penggantian sebaris dan memerlukan panggilan tambahan ke . Walau bagaimanapun, beberapa pelaksanaan JVM, termasuk Sun, melaksanakan penggantian sebaris kaedah maya yang paling kerap dipanggil.

C# memerlukan pengisytiharan eksplisit tentang niat untuk mengatasi kaedah maya dalam kelas terbitan. Niat ini diterangkan oleh kata kunci ganti. Jika overriding bukanlah niat pengaturcara, dan seseorang hanya mahu memperkenalkan kaedah maya baharu dengan nama dan tandatangan yang sama untuk membayangi yang lama, maka kata kunci lain, new , diperlukan. Jika tiada perkataan ini dinyatakan, ini mengakibatkan ralat penyusunan. Di Java, mana-mana kaedah sentiasa hampir mengatasi kaedah kelas asas dengan nama dan tandatangan yang sama, jika ada. Tingkah laku ini berpotensi berbahaya jika kelas asas dicipta oleh pembangun lain, dan versi baharu memperkenalkan kaedah yang sama yang telah wujud dalam kelas terbitan; dalam kes ini, kaedah sedia ada daripada kelas terbitan akan mengatasi kaedah yang baru diperkenalkan dalam kelas asas, yang bukan niat kedua-dua pembangun.

Penyusunan bersyarat

C#, tidak seperti Java, menyokong kompilasi bersyarat menggunakan . Ia juga mempunyai atribut Bersyarat, yang bermaksud bahawa kaedah yang ditentukan hanya dipanggil apabila pemalar kompilasi yang diberikan ditakrifkan. Dengan cara ini, anda boleh memasukkan ke dalam kod, contohnya, semakan penegasan, yang hanya akan berfungsi dalam versi nyahpepijat apabila pemalar DEBUG ditakrifkan. Dalam .NET Standard Library, ini ialah kaedah Debug.Assert(). Java versi 1.4 dan lebih baru termasuk ciri semakan andaian masa jalan dalam bahasa.

Ruang nama dan fail sumber

Ruang nama C# lebih mengingatkan C++. Tidak seperti Java, lokasi fail sumber tiada kaitan dengan ruang namanya. Walaupun, secara tegasnya, lokasi fail sumber dalam Java tidak semestinya menggambarkan struktur direktori pakej, ia adalah tingkah laku lalai.

Java memerlukan nama fail sumber mestilah betul-betul sepadan dengan nama satu-satunya kelas awam yang ditakrifkan di dalamnya, manakala C# membenarkan anda mentakrifkan beberapa kelas awam dalam satu fail dan tidak mengenakan sebarang sekatan pada nama fail, dan juga (dalam versi 2.0 dan ke atas) membolehkan anda membahagikan kelas kepada dua atau lebih fail (separa kata kunci).

Pengecualian

Sokongan Java diperiksa, memaksa penangkapan penuh dan pemprosesan semua situasi yang luar biasa. Semua pengecualian yang boleh dilemparkan oleh kaedah mesti disenaraikan dalam pengisytiharannya menggunakan kata kunci lontaran. C# tidak menyokong pengecualian yang diperiksa. Sesetengah pembangun mendapati pengecualian yang disemak sangat berguna untuk memastikan gaya yang baik pengaturcaraan. Yang lain, termasuk ketua arkitek C#, berpendapat bahawa di Jawa mereka sedikit sebanyak satu percubaan dan tidak membenarkan diri mereka sendiri.

Salah satu hujah terhadap pengecualian yang diperiksa ialah apabila ia digunakan, menukar kod dalaman sesuatu fungsi boleh membawa kepada melontarkan pengecualian baharu, yang memerlukan perubahan dalam pengisytiharan fungsi ini dan semua yang lain yang memanggilnya. Akhirnya, untuk mengekalkan keserasian antara muka, adalah perkara biasa untuk hanya mengisytiharkan fungsi sebagai lontaran Exception , dengan itu menafikan keseluruhan idea pengecualian yang diperiksa. Satu lagi cara untuk mengekalkan keserasian antara muka dalam Java ialah menangkap pengecualian yang baru diperkenalkan, membungkusnya dengan yang diisytiharkan lama, dan membuangnya semula. Sebagai contoh, jika kaedah diubah supaya ia mula mengakses pangkalan data dan bukannya sistem fail, maka ia boleh menangkap SQLException itu sendiri dan membuang IOException yang baru dilemparkan sebaliknya, kerana pengguna kaedah itu tidak seharusnya mengetahui butiran pelaksanaan dalamannya.

Kod tahap rendah

Perlaksanaan

JVM dan CLR

Java ada di mana-mana dalam semua jenis sistem pengendalian dan persekitaran. Banyak pelaksanaan wujud, kadangkala sumber terbuka.

Teknologi ClickOnce menawarkan fungsi yang serupa dengan Java Webstart, tetapi hanya tersedia untuk klien Windows. Internet Explorer pada Windows juga boleh memaparkan .NET Windows Forms, yang menyediakan fungsi seperti applet, tetapi terhad kepada penyemak imbas tertentu.

Penyeragaman

Bahasa C# tidak ditakrifkan oleh Microsoft, tetapi oleh jawatankuasa piawaian dan . Walaupun Sun mengekalkan hak cipta dan kuasa veto ke atas platform Java, yang terakhir ini sebahagian besarnya ditadbir melalui Proses Komuniti Java (JCP), yang membenarkan pihak yang berminat untuk terlibat dalam menentukan versi dan ciri baharu spesifikasi teknologi Java.

Piawaian ECMA dan ISO untuk C# dan .NET mentakrifkan bahasa, rangka kerja CLI dan kelas asas (Base Class Library atau BCL). Piawaian tidak termasuk banyak perpustakaan baharu yang telah dilaksanakan oleh Microsoft di atas rangka kerja standard, seperti perpustakaan untuk pangkalan data, GUI dan aplikasi web ( , dan ). Walau bagaimanapun, Microsoft secara rasmi bersetuju untuk tidak mendakwa projek komuniti untuk melaksanakan perpustakaan ini.

Penggunaan

Komuniti

Java dibina di atas budaya yang lebih terbuka dengan firma yang berdaya saing tinggi dalam bidang fungsi yang berbeza. Walaupun ini menyelesaikan sepenuhnya masalah kebebasan vendor perisian, ia menambahkan kerumitan tambahan kepada bahasa. Untuk berjaya menggunakan perpustakaan dan komponen, anda perlu mengetahui bukan sahaja Java, tetapi juga semua pelbagai cangkerang dan rangka kerja yang bersaing dan pelbagai "helah" pelaksanaan.

Populariti dan pembangunan

Java lebih tua daripada C# dan dibina di atas pangkalan pengguna yang besar dan aktif, menjadi dalam banyak bidang moden sains komputer, terutamanya yang . Java mendominasi kursus pengaturcaraan di universiti dan kolej Amerika, dan terdapat lebih banyak literatur tentang Java hari ini berbanding C#. Kematangan dan populariti Java telah membawa kepada lebih banyak perpustakaan dan API dalam Java (kebanyakannya adalah sumber terbuka) berbanding dalam C#.

Tidak seperti Java, C# ialah bahasa yang agak baharu. Microsoft mempelajari bahasa sedia ada seperti Java dan , dan menukar beberapa aspek bahasa agar lebih sesuai dengan keperluan jenis aplikasi tertentu. Lama kelamaan, kelebihan sementara Java menjadi kurang ketara.

Satu kritikan yang boleh didengar tentang Java ialah ia lambat untuk dibangunkan dan kekurangan beberapa ciri yang difasilitasi oleh corak dan metodologi pengaturcaraan yang bergaya. Kritikan terhadap bahasa C# ialah pembangunnya mungkin terlalu bersemangat untuk menampung aliran semasa dalam pengaturcaraan dengan mengorbankan tumpuan dan kesederhanaan bahasa tersebut. Pereka Java nampaknya mengambil pendekatan yang lebih konservatif untuk menambah ciri baharu utama pada sintaks bahasa berbanding bahasa moden yang lain—mungkin tidak mahu menggunakan bahasa itu kepada aliran yang mungkin membawa kepada jalan buntu dalam jangka masa panjang. Java 5.0 mengatasi trend ini dalam banyak cara, kerana ia memperkenalkan beberapa ciri baharu utama bahasa: gelung foreach, pembalut automatik, kaedah variadik, jenis terhitung, generik dan anotasi (semuanya terdapat dalam C#) .

C#, seterusnya, berkembang dengan lebih pantas, mengehadkan dirinya lebih kurang dalam menambah ciri khusus masalah baharu. Aliran ini amat ketara dalam versi C# 3.0 yang akan datang, di mana, sebagai contoh, pertanyaan -seperti muncul. (Ciri-ciri baharu direka bentuk untuk mengekalkan bahasa sebagai bahasa tujuan umum. Untuk maklumat lanjut tentang C# 3.0, lihat

Ia boleh dipertikaikan sama ada pembangunan C# dalam beberapa cara adalah hasil daripada pengiktirafan Microsoft bahawa persekitaran kod terurus yang diterajui Java mempunyai banyak kelebihan dalam dunia yang semakin rangkaian, terutamanya dengan kemunculan Internet pada peranti selain komputer peribadi dan peningkatan kepentingan keselamatan rangkaian. Sebelum C# dicipta, Microsoft mengubah suai Java (dengan mencipta ) untuk menambah ciri yang hanya berfungsi pada OS, sekali gus melanggar perjanjian lesen. Semasa Microsoft berada dalam fasa kedua strategi perniagaannya, dikenali sebagai , pembangunan J++ telah dihentikan oleh tuntutan mahkamah yang difailkan oleh Sun. Dilucutkan peluang untuk membangunkan klon Java dengan ciri yang dikehendakinya, Microsoft mencipta alternatif yang lebih sesuai dengan keperluan dan wawasan masa depan mereka.

Walaupun permulaan yang bergelora ini, semakin jelas bahawa dua bahasa jarang bersaing antara satu sama lain di pasaran. Java menguasai sektor mudah alih dan mempunyai ramai pengikut dalam pasaran aplikasi web. C# telah menerima penerimaan yang baik dalam pasaran aplikasi desktop Windows dan sedang didorong oleh Microsoft sebagai bahasa utama untuk aplikasi Windows. Terima kasih kepada , C# juga merupakan pemain dalam pasaran aplikasi web.

Aplikasi Desktop

Java kadangkala dituduh terlalu menjanjikan dan kurang penyampaian apabila melibatkan aplikasi desktop. Walaupun perpustakaan tingkap AWT (Abstract Windowing Toolkit) mempunyai banyak keupayaan, Java terpaksa bergelut untuk mewujudkan dirinya dalam pasaran aplikasi desktop. Dia berpegang teguh pada prinsip<пишем один раз, используем везде>menyukarkan untuk memanfaatkan sepenuhnya keupayaan dan mod operasi tertentu dalam setiap sistem desktop tertentu. Akibatnya, aplikasi desktop yang ditulis dalam Java selalunya kelihatan seperti<чужие>pada platform di mana mereka dilaksanakan.

Sun Microsystems, ada yang berkata, juga lambat mempromosikan Java kepada pembangun dan pengguna dengan cara yang menjadikannya menarik untuk aplikasi desktop. Malah teknologi seperti Java Web Start, yang mempunyai sedikit pesaing antara bahasa dan platform, telah dipromosikan dengan buruk.

Keluaran Java versi 6.0, dijangka pada tahun 2006, memfokus semula pada pasaran desktop - dengan set luas alat baharu dan menarik untuk penyepaduan yang lebih baik dan lebih ketat dengan persekitaran desktop.

berteknologi tinggi

Java telah diterima pakai sebagai perisian rasmi untuk digunakan dalam standard DVD generasi akan datang, melalui platform interaktif BD-J. Ini bermakna kandungan interaktif seperti menu, permainan, muat turun, dsb. berada pada semua pemacu DVD Blu-ray akan dibuat pada platform Java.