Untuk alasan apa saya harus memilih C # di atas Java dan C ++? [Tutup]

46

C # tampaknya menjadi populer akhir-akhir ini. Saya mendengar bahwa secara sintaksis hampir sama dengan Java. Java dan C ++ sudah ada sejak lama. Untuk alasan apa saya harus memilih C # di atas Java dan C ++?

Dark Templar
sumber
16
Seperti yang ditulis, pertanyaannya adalah contoh buku teks yang tidak konstruktif "bahasa mana yang lebih baik?" pertanyaan di luar topik di sini. Saya telah berusaha membuatnya lebih konstruktif dengan hasil edit karena sebenarnya ada jawaban yang baik dan dipikirkan dengan baik. Tetap saja, ingatlah FAQ dan posting blog ini saat mengajukan pertanyaan seperti ini.
Adam Lear
Biarkan saya menambahkan beberapa item edgier. .NET memiliki DOM yang didefinisikan dengan baik ( misalnya CodeDOM ) untuk bahasanya dan akibatnya menghasilkan hal-hal secara dinamis saat runtime jauh lebih sederhana dan lebih efisien. Ini juga dapat membantu sebagai kemampuan infrastruktur. Juga, sistem tipe memiliki kecocokan 1-ke-1 dengan semua jenis W3 asli. Pada intinya, W3 dan interops lainnya dimasukkan ke dalam bahasa sejak awal. Untuk bahasa-bahasa lain, kekhawatiran ini baru saja diatasi, dan menghadirkan banyak tantangan bagi mereka. Juga, jika Anda akan melakukan interoping dengan banyak bahasa dan / atau protokol maka .NET juga sangat kuat
JoeGeeky
5
Hai, JoeGeeky, tambahkan komentar Anda sebagai jawaban untuk pertanyaan itu.
Anthony Mastrean
1
Pertanyaan sebenarnya adalah: Untuk alasan apa saya harus memilih Nemerle, F * dan F # lebih dari C #? (yaitu, ketiga bahasa berasal dari MS dan ketiganya lebih baik)
mrsteve
Saya benar-benar tidak berpikir pernyataan apa pun dari genre "bahasa / platform X dibandingkan dengan bahasa / platform Y SELALU lebih baik" dan saya juga berpikir bahwa untuk X dan Y apa pun dapat dengan mudah dibatalkan untuk konteks tertentu. Apa gunanya pertanyaan ini?
Shivan Dragon

Jawaban:

76

Pertanyaannya harus "Bahasa mana yang lebih cocok untuk pengembangan aplikasi modern dan tipikal?".

Sunting: Saya membahas beberapa komentar di bawah. Sebuah komentar kecil: pertimbangkan bahwa ketika Anda memiliki banyak hal secara asli, sebagai idiom, itu adalah perbedaan besar daripada menerapkan atau mengunduh dan menggunakannya sendiri setiap saat. Hampir semuanya dapat diimplementasikan dalam bahasa-bahasa ini. Pertanyaannya adalah - bahasa apa yang disediakan secara asli untuk Anda.

Jadi dari atas kepala saya (beberapa argumen berlaku untuk kedua bahasa) ...

C # lebih baik daripada C ++ karena:

  • Ini memiliki pengumpulan sampah asli .
  • Ini memungkinkan Anda untuk memperlakukan tanda tangan metode-kelas sebagai fungsi bebas (yaitu mengabaikan thisargumen pointer yang diketik secara statis ), dan karenanya menciptakan hubungan yang lebih dinamis dan fleksibel antar kelas. sunting jika Anda tidak tahu apa artinya ini, maka cobalah menetapkan metode anggota yang mengembalikan void dan menerima void ke void (*ptr)()variabel. Delegasi C # membawa thispointer, tetapi pengguna tidak selalu harus peduli tentang itu. Mereka hanya dapat menetapkan void()metode kelas apa saja untuk void()delegasi lain .
  • Ini memiliki perpustakaan standar besar dengan begitu banyak hal berguna yang diimplementasikan dengan baik dan mudah digunakan.
  • Hal ini memungkinkan untuk blok kode yang dikelola dan asli.
  • Versi perakitan dengan mudah memperbaiki masalah neraka DLL.
  • Anda bisa mengatur kelas, metode, dan bidang menjadi internal-perakitan (yang berarti mereka dapat diakses dari mana saja dalam DLL tempat mereka dideklarasikan, tetapi tidak dari majelis lain).

C # lebih baik daripada Java dalam hal itu:

  • Alih-alih banyak kebisingan (EJB, implementasi kelas statis privat, dll) Anda mendapatkan konstruksi asli yang elegan dan ramah seperti Properti dan Acara.
  • Anda memiliki obat generik nyata (bukan lelucon casting buruk yang disebut Java obat generik), dan Anda dapat melakukan refleksi terhadapnya.
  • Ini mendukung idiom manajemen sumber daya asli ( usingpernyataan). Java 7 juga akan mendukung ini, tetapi C # telah memilikinya untuk waktu yang lebih lama.
  • Tidak ada pengecekan pengecualian :) (dapat diperdebatkan apakah ini baik atau buruk)
  • Ini sangat terintegrasi dengan Windows, jika itu yang Anda inginkan.
  • Ini memiliki Lambdas dan LINQ, karena itu mendukung sejumlah kecil pemrograman fungsional.
  • Ini memungkinkan untuk kovarians generik dan contravariance secara eksplisit.
  • Ini memiliki variabel dinamis, jika Anda menginginkannya.
  • Dukungan enumerasi yang lebih baik, dengan yieldpernyataan.
  • Ini memungkinkan Anda untuk menentukan tipe nilai baru (atau non-referensi).

Edit - Mengatasi komentar

  • Saya tidak mengatakan C ++ tidak mendukung RAII asli. Saya katakan Java tidak memilikinya (Anda harus secara eksplisit mencoba / akhirnya). C ++ memiliki auto pointer yang bagus untuk RAII, dan (jika Anda tahu apa yang Anda lakukan) juga dapat menggantikan pengumpulan sampah.
  • Saya tidak mengatakan apa-apa tentang meniru fungsi gratis. Tetapi misalnya jika Anda perlu mengakses bidang dengan thispointer, dan mengikat metode yang melakukannya ke pointer fungsi generik (yaitu tidak di kelas yang sama), maka tidak ada cara asli untuk melakukannya. Dalam C #, Anda mendapatkan secara gratis. Anda bahkan tidak perlu tahu cara kerjanya.
  • Dengan "memperlakukan metode anggota sebagai fungsi bebas" saya maksudkan bahwa Anda tidak dapat, misalnya, mengikat metode anggota secara manual ke tanda tangan fungsi bebas, karena metode anggota "diam-diam" memerlukan thispointer.
  • The usingpernyataan, jelas bersama dengan pembungkus IDisposable, adalah contoh yang bagus dari RAII. Lihat tautan ini . Pertimbangkan bahwa Anda tidak perlu RAII sebanyak dalam C # seperti yang Anda lakukan dalam C ++, karena Anda memiliki GC. Untuk waktu-waktu tertentu Anda memang membutuhkannya, Anda dapat menggunakan usingpernyataan itu secara eksplisit . Pengingat kecil lainnya: membebaskan memori adalah prosedur yang mahal. GC memiliki keunggulan kinerja mereka dalam banyak kasus (terutama ketika Anda memiliki banyak memori). Memori tidak akan bocor, dan Anda tidak akan menghabiskan banyak waktu untuk melakukan deallocating. Terlebih lagi, alokasi juga lebih cepat, karena Anda tidak mengalokasikan memori setiap kali, hanya sesekali. Memanggil newhanya menambah pointer objek terakhir.
  • "C # lebih buruk karena memiliki pengumpulan sampah". Ini memang subyektif, tetapi seperti yang saya nyatakan di atas, untuk sebagian besar pengembangan aplikasi modern dan tipikal, pengumpulan sampah adalah keuntungan besar.
    Dalam C ++, pilihan Anda adalah mengelola memori secara manual menggunakan newdan delete, yang secara empiris selalu mengarah ke kesalahan di sana-sini, atau (dengan C ++ 11) Anda dapat menggunakan auto pointer secara native, tetapi perlu diingat bahwa mereka menambah banyak dan banyak kebisingan ke kode. Jadi GC masih memiliki keunggulan di sana.
  • "Generik jauh lebih lemah daripada templat" - Saya hanya tidak tahu dari mana Anda mendapatkannya. Template mungkin memiliki kelebihannya, tetapi dalam kendala pengalaman saya, pengecekan tipe parameter umum, contravariance, dan kovarian adalah alat yang jauh lebih kuat dan elegan. Kekuatan dalam template adalah mereka memungkinkan Anda bermain sedikit dengan bahasa, yang mungkin keren, tetapi juga menyebabkan banyak sakit kepala ketika Anda ingin men-debug sesuatu. Jadi semuanya, templat memiliki fitur-fitur yang bagus, tetapi saya menemukan obat generik lebih praktis dan bersih.
Yam Marcovic
sumber
5
Dan jika Anda masih menginginkan Pengumpul Sampah untuk C ++, Anda dapat mengunduhnya .
fredoverflow
3
mari kita lanjutkan diskusi ini dalam obrolan
Yam Marcovic
6
Fitur penting lainnya dalam C # dibandingkan dengan Java, untuk alasan kinerja, adalah "struct", jenis objek yang dapat disimpan di stack (atau dalam register CPU, dalam kasus khusus) atau tertanam dalam objek tumpukan lainnya. Mereka sering digunakan untuk objek kecil dengan 1-4 bidang, seperti pasangan koordinat X, Y.
Qwertie
2
@LokiAstari Mind menjelaskan? Selama Anda ingat untuk membatalkan pendaftaran penangan acara dan menggunakan pola Buang di kelas yang berisi pembungkus asli, Anda akan baik-baik saja. Itu jauh lebih sedikit untuk diketahui dan diingat daripada manajemen memori di C ++.
Yam Marcovic
2
-1 karena saya melewatkan bagian "C ++ lebih baik dari C # dalam ..." dan "Java lebih baik dari C # ...". Saya tidak berpikir C # lebih unggul di semua bidang sehingga jawaban tanpa dua bagian ini mungkin kurang beberapa informasi penting.
Giorgio
30

Lingkungan

.NET Framework dan klien Windows

Windows adalah Sistem Operasi yang mendominasi pada komputer klien. Kerangka kerja GUI terbaik untuk aplikasi Windows adalah Winforms dan WPF bersama dengan .NET Framework . Bahasa pemrograman terbaik untuk bekerja dengan .NET Framework dan APInya adalah C # . Java bukan alternatif untuk ini. Dan C ++ adalah bahasa yang lebih tua tanpa manajemen memori otomatis. C # mirip dengan C ++ tetapi memiliki manajemen memori otomatis dan Anda tidak harus bekerja dengan pointer, yang membuat Anda lebih produktif. C ++ masih bisa menjadi pilihan terbaik untuk beberapa kasus, tetapi tidak untuk aplikasi database intensif bentuk yang umum dalam bisnis.

IIS dan Windows Server

Jika Anda terbiasa bekerja di lingkungan Windows dan dengan C #, Anda memerlukan investasi paling sedikit untuk mempelajari IIS untuk pemrograman server dan Windows Server untuk administrasi dasar.

Direktori Aktif dan Server Windows

Jika Anda mengembangkan perangkat lunak yang akan digunakan di jaringan perusahaan, kemungkinan mereka menggunakan lingkungan yang berpusat pada Windows menggunakan Windows Server dengan Active Directory. Dalam lingkungan seperti itu mudah untuk mengintegrasikan dan menggunakan solusi yang dibuat dalam C # dan .NET Framework .

Secara pribadi, saya adalah pengembang Java, bukan pengembang C #, tetapi saya bekerja dengan web. Saya akan beralih ke C # jika saya sedang mengembangkan aplikasi jaringan untuk jaringan Windows. Tapi saya lebih suka Java untuk server web berbasis Linux. Saya akan memilih C ++ untuk embedded system kalau saya tidak akan banyak bergantung.

Ya, C # adalah bahasa yang lebih baik dengan fitur yang lebih modern daripada C ++ dan Java, tetapi itu bukan hal yang paling penting untuk memilih C # .

Ringkasan

Lingkungan untuk perangkat lunak Anda adalah yang paling penting untuk memilih C # . Jika Anda bekerja di lingkungan dengan klien Windows, server Windows, Active Directory, IIS dan mungkin SQL Server maka C # adalah bahasa yang paling baik dengan .NET Framework .

Jika Anda bekerja di lingkungan Unix dengan misalnya layanan web, Java akan menjadi pilihan saya. Dan jika Anda bekerja dengan sistem embedded atau harus berintegrasi dengan perangkat perangkat keras C ++ akan menjadi pilihan yang baik.

Jonas
sumber
3
Tentu saja - ini sebabnya saya menggunakan C # tidak benar-benar alasan lain
Murph
Anda tentu dapat menggunakan .NET pada platform lain melalui Mono, MonoTouch dan MonoDroid, tetapi tolok ukur saya menemukan Mono secara signifikan lebih lambat daripada .NET untuk Windows, dan Kerangka Kerja Compact Microsoft sendiri sangat lambat pada Windows CE: codeproject.com/KB/cross -platform / BenchmarkCppVsDotNet.aspx ... tentu saja, WPF hanya tersedia di Windows (tapi saya toh tidak menyukainya.)
Qwertie
Dependensi mana yang Anda maksudkan, "Saya akan memilih C ++ untuk sistem embedded jika saya tidak akan banyak bergantung." Apakah maksud Anda perpustakaan java?
Puckl
@Puckl ya, tapi kebanyakan jvm / jre.
Jonas
"Jika Anda bekerja di lingkungan Unix dengan mis. Layanan web" ada beberapa bahasa lain & kerangka kerja yang dapat dipertimbangkan: ruby, Python, node.js dll
MarkJ
15

C # dan Java

C # adalah bahasa yang sangat baik jika:

  • Anda ingin melakukan pengembangan berorientasi objek tujuan umum. Ini adalah bahasa OOP klasik yang diketik secara statis.
  • Anda hanya menargetkan platform Microsoft (perlu diingat bahwa Microsoft secara efektif mengkloning Java untuk membuat C # karena mereka menginginkan bahasa seperti Java yang akan mengunci orang ke Windows. Mereka bisa menggunakan Java, tetapi itu akan memungkinkan orang untuk dengan mudah menjalankan aplikasi di platform lain ....)

C # sebagai bahasa lebih bagus daripada Java dalam berbagai cara (sintaksis yang lebih baik untuk properti, tipe nilai, reified generics, dll.). Saya lebih suka C # sebagai bahasa ke Jawa tetapi dalam skema besar hal itu bahasa yang cukup mirip dan cocok untuk aplikasi serupa.

Di sisi lain, Jawa juga memiliki beberapa keuntungan besar:

  • Ekosistem open source besar - perpustakaan untuk Jawa yang bisa Anda dapatkan secara gratis sejauh ini adalah yang terbaik dari bahasa apa pun. Sulit untuk melebih-lebihkan pentingnya ini - dari titik menyelesaikan sesuatu, Jawa sangat efektif.
  • Alat - alat Java menurut saya lebih baik daripada apa yang Anda bisa dapatkan dari dunia .Net. misalnya Maven (setelah Anda menguasainya!) sangat mengesankan.
  • Maintainability - Java telah ada sejak lama dan telah berhasil di perusahaan-perusahaan besar justru karena relatif stabil dan ada banyak upaya dimasukkan ke dalam kompatibilitas mundur. Sintaksis yang sederhana dan sedikit verbose juga membantu Java di sini - lebih mudah untuk membaca dan memelihara kode jika kode tersebut sangat jelas dan eksplisit.
  • Bahasa baru - JVM memiliki beberapa bahasa baru yang menakjubkan (Scala, Clojure, Groovy dll.) Yang merupakan masa depan platform Java. Di sinilah banyak inovasi bahasa terjadi, dan itu terjadi jauh lebih cepat daripada di Jawa atau C #.

Jadi Java vs C # adalah panggilan yang cukup dekat dan itu benar-benar turun ke apakah Anda ingin berada di kamp Microsoft atau kamp Open Source / lintas-platform.

Secara pribadi, saya lebih suka Java karena:

  • Ekosistem perpustakaan menurut saya jauh lebih penting daripada fakta bahwa C # memiliki sintaksis yang lebih baik daripada Java
  • Dalam jangka panjang, saya ingin semua kode saya benar-benar cross-platform dan dapat dijalankan pada kelompok besar mesin linux murah di cloud.
  • Clojure adalah IMHO bahasa yang paling menjanjikan di dunia saat ini, dan jika saya tetap menggunakan platform JVM saya akan dapat mentransisikan kode dan keterampilan saya dengan mudah ke Clojure seiring waktu.

C / C ++

C / C ++ pada dasarnya adalah binatang yang sama sekali berbeda. Saya tidak akan merekomendasikan hal ini untuk pengembangan aplikasi tujuan umum saat ini karena alasan berikut:

  • Manajemen memori - untuk sebagian besar pemrograman tujuan umum saat ini, Anda tidak ingin mengelola memori Anda sendiri. Pengumpulan sampah di C # atau Java jauh lebih baik untuk produktivitas dan kewarasan Anda daripada teknik manajemen memori eksplisit apa pun yang harus Anda gunakan dalam C / C ++
  • Kompleksitas - C ++ khususnya adalah bahasa yang sangat kompleks. Butuh waktu lama untuk dikuasai dan kode itu sendiri juga bisa sangat rumit. (Template C ++ misalnya sangat berbulu ....)
  • Produktivitas - sebagian besar waktu dan yang lainnya sama, Anda akan membutuhkan waktu lebih lama untuk menyelesaikan pekerjaan di C / C ++.

Namun itu tidak diragukan lagi pilihan yang bagus dalam sejumlah domain khusus tertentu, khususnya:

  • Sistem operasi - Anda mungkin ingin menggunakan C / C ++ jika Anda menulis sistem operasi.
  • Pengembangan game - hampir semua mesin game komersial terbaik adalah C / C ++. Ini masih merupakan pilihan terbaik jika Anda mengembangkan judul AAA yang menuntut (C # dan Java baik-baik saja untuk permainan yang kurang menuntut / kasual)
  • Komputasi berkinerja tinggi - C / C ++ yang dioptimalkan mungkin merupakan cara terbaik untuk membuat kode berkinerja sangat tinggi. Untuk sebagian besar aplikasi yang melakukan tingkat optimasi ini tidak sepadan dengan usaha, tetapi dalam domain tertentu itu bisa sangat berharga (misalnya perdagangan frekuensi tinggi)
  • Akses perangkat keras - Anda memerlukan akses langsung ke perangkat keras (misalnya untuk sistem tertanam)

Jadi pada dasarnya, C / C ++ adalah pilihan yang bagus jika dan hanya jika Anda berfokus pada salah satu domain yang sangat cocok.

mikera
sumber
1
Anda menyebutkan pakar sebagai contoh alat yang lebih baik untuk java. Saya tidak terlalu famialr dengan itu, tetapi melihat dokumentasi, Maven terlihat lebih mirip dengan asli. Net membangun alat MSBuild. Apa yang membuat Maven lebih baik dari MSBuild?
Kevin Cathcart
1
+! (hanya karena saya hanya memiliki satu suara): Anda telah menjelaskan dengan sangat baik mengapa ekosistem Java lebih baik dan mengapa kita tidak harus membandingkan hanya sintaks C # vs Java. Java memiliki perpustakaan dan alat yang lebih banyak dan lebih baik. Tidak banyak yang terjadi dalam bahasa Jawa itu sendiri, tetapi bahasa baru yang sangat menarik muncul untuk JVM yang (IMO) jauh lebih menarik daripada C #. Saya tidak tahu Clojure tetapi saya menemukan Scala sangat menarik: dirancang untuk menjadi OOP + FP dari awal.
Giorgio
2
mengapa semua orang berpikir kode C ++ penuh dengan manajemen memori manual. Ini bukan C, Anda tahu, RAII berarti Anda hampir tidak perlu mengalokasikan / membebaskan memori secara manual (waktu yang Anda lakukan adalah saat-saat di mana bahasa seperti C # tidak akan berguna bagi Anda).
gbjbaanb
3
@ gbjbaanb - mungkin karena RAII tidak memadai untuk manajemen memori tujuan umum. Ini sama sekali tidak setara dalam fleksibilitas untuk sistem GC penuh seperti yang Anda lihat di Java atau C #. Segera setelah Anda melampaui batas RAII, Anda kembali ke wilayah manajemen memori manual.
mikera
3
@mikera Hanya ingin menunjukkan bahwa ada sedikit perkembangan bahasa pada platform .NET juga. Misalnya F # adalah bahasa fungsional yang rapi yang dengan lancar mengintegrasikan sisa .NET, dan Python baru-baru ini dipindahkan ke .NET sebagai Iron Python (dan mendapat IDE yang bagus juga!).
ikh
13
I heard that syntactically they are almost the same.

Secara sintaksis? Siapa yang memberi monyet terbang tentang sintaksis? Sintaks hanya baik untuk satu hal: memungkinkan migrasi yang lebih cepat dari bahasa yang mirip secara sintaksis. Itu dia.

C # jauh lebih baik daripada Java. Pertimbangkan dukungan pemrograman generik dan fungsional mereka - C # jauh di depan Jawa. Belum lagi kelebihan operator, dan hal-hal bagus lainnya - C # jauh lebih baik ditampilkan. Tidak mungkin Java bisa dianggap lebih baik daripada C #.

C ++ dan C # lebih merupakan kontes. C ++ memiliki model kompilasi kuno yang sangat menjengkelkan dan banyak penyakit warisan dari C, tetapi templatnya jauh lebih kuat daripada obat generik, dan pendekatan pengelolaan sumber dayanya jauh lebih fleksibel dan kuat secara umum, seperti usingkegagalan total, dan dijalankan lebih cepat.

DeadMG
sumber
6
Saya pikir kita harus membandingkan fitur bahasa dan ketersediaan bahasa pada platform yang berbeda. Dengan C # one dikunci dengan Microsoft, dengan Java satu tidak: itu keuntungan besar, setidaknya untuk pengembang UNIX / Linux. OOP + FP adalah fitur keren tetapi mengapa repot-repot dengan C # jika Anda dapat menggunakan Scala, yang berjalan pada JVM dan dapat berinteraksi dengan kode Java lawas? Saya tidak akan pernah belajar bahasa khusus platform kecuali saya dipaksa.
Giorgio
2
@Iorgio: Proyek Mono memang ada. Tetapi kedua, Microsoft benar-benar merawat platform mereka - mereka memberikan upgrade besar secara teratur. Java hampir tidak memiliki sesuatu yang baru. Juga, pertanyaannya adalah tentang C # vs Java, bukan CLR vs JVM.
DeadMG
4
@DeadMG: Sejauh yang saya tahu saya tidak bisa mengambil program C # yang dikembangkan di Windows dan membangunnya dengan Mono. Bukan CLR vs JVM? Pertanyaannya adalah mengapa orang menggunakan C # atau Java. Agar orang dapat menggunakan bahasa, mereka membutuhkan runtime dan sistem operasi. Saya tidak membahas tentang fakta bahwa C # memiliki lebih banyak fitur daripada Java, tetapi Java jauh lebih portabel: ini adalah faktor yang dapat mempengaruhi adopsi suatu bahasa. Bahkan Java masih digunakan lebih sering daripada C # bahkan jika tidak memiliki fitur-fitur canggih tertentu.
Giorgio
3
@Ggio, Anda dapat mengambil program C # dan membangunnya dengan Mono. Anda tidak dapat menggunakan perpustakaan tertentu (yang bukan merupakan bagian dari bahasa C #) Dan java tidak "jauh lebih portabel". Anda dapat kode untuk iOS dalam C #, tetapi tidak di Jawa, misalnya.
SK-logic
2
@Giogio, Mono setidaknya se portable JVM.
SK-logic
7

Yah C#memiliki beberapa fitur bawaan yang bagus seperti LINQdan delegasi. Ini mendapatkan yang terbaik dari kedua dunia - Javadan C++. Lihat di sini untuk perbandingan lengkap.

Tapi saya suka Javadunia lebih baik - lebih banyak kerangka kerja open source dan berjalan di setiap platform. Dan jangan beri tahu saya Mono- ini bukan pilihan yang bisa diandalkan.

Petar Minchev
sumber
9
+1: "Tapi saya lebih menyukai dunia Java - jauh lebih banyak kerangka kerja open source dan berjalan di setiap platform." Semoga saja Oracle tidak mengubah ini!
Giorgio
15
Pikiran menjelaskan, apa yang tidak "dapat diandalkan" di Mono?
SK-logic
2
@Petar Minchev, Ini tidak lain adalah kesalahan Anda sendiri. Anda harus mengikuti pedoman portabilitas dan Anda tidak boleh menggunakan perpustakaan non-portabel - dan dengan cara ini aplikasi kompleks mana pun akan berjalan andal dengan Mono. Hal-hal seperti WPF tidak akan pernah diangkut.
SK-logic
2
@Petar Minchev, ada banyak perpustakaan Java non-portabel di luar sana. Anda harus selalu berhati-hati tentang portabilitas, apa pun bahasa yang Anda gunakan. Lagi pula, pertanyaannya adalah tentang bahasa, bukan perpustakaan pihak ketiga.
SK-logic
3
@Petar Minchev, GTK # bersifat portabel. Gunakan itu sebagai gantinya.
SK-logic
3

Menurut beberapa sumber (lihat misalnya http://www.indeed.com/jobtrends ) C # masih kurang populer daripada Java, dan sepopuler C ++.

C # memang menyediakan fitur yang kurang dimiliki Java, misalnya dukungan langsung untuk idiom pemrograman tertentu seperti properti, gaya pemrograman fungsional, dan sebagainya. C # memiliki tingkat abstraksi yang lebih tinggi daripada C ++, yang merupakan keuntungan ketika waktu pengembangan lebih penting daripada kecepatan program.

Secara pribadi, saya masih lebih suka dunia Java / C ++. Seperti yang dikatakan Petar Minchev, Java memiliki lebih banyak kerangka kerja sumber terbuka dan aplikasi, yang beroperasi di mana-mana, kurang terikat pada vendor dan sistem operasi tertentu. C ++ memiliki kelebihan yang serupa, meskipun kode seringkali membutuhkan adaptasi dari satu platform ke platform lainnya. Karena saya lebih suka mengembangkan di Linux dan, setahu saya, saya tidak bisa sepenuhnya menggunakan C # di Linux, saya tidak pernah tertarik dengan C # karena kebutuhan pemrograman saya dicakup oleh C, C ++, Java, Scala.

Di sisi lain, bagi banyak pengembang yang terikat pada vendor tertentu bukan masalah: Microsoft memiliki posisi dominan di pasar sistem operasi dan C # memberikan banyak peluang kerja. Oleh karena itu, banyak pengembang IMO mengadopsi C # karena, selain menjadi bahasa yang kaya fitur, juga merupakan investasi yang baik.

Giorgio
sumber
"Saya tidak dapat sepenuhnya menggunakan C # di Linux" - Bisakah Anda menguraikan ini? Maksud Anda kerangka kerja .Net penuh tidak tersedia karena saya belum mengalami masalah dengan bahasa C # itu sendiri (atau F # untuk hal itu) di Linux?
Wesley Wiser
@wawa: Sepengetahuan saya, kerangka. Net berhubungan dengan JDK, dan kerangka .Net hanya tersedia untuk Windows sedangkan JDK tersedia untuk beberapa OS. Jika ini tidak benar, saya dapat mengedit jawaban saya (dan mengubah pendapat saya juga).
Giorgio
1
Saya pikir analogi yang lebih dekat adalah Perpustakaan Kelas Dasar untuk JDK. BCL memiliki komponen standar dan tidak standar. Proyek mono mengimplementasikan potongan standar dan banyak yang tidak standar.
Wesley Wiser
@wawa: Terima kasih atas informasinya. Saya sedang mempertimbangkan untuk mencoba C # menggunakan Mono. Namun, saya masih memiliki perasaan yang cukup kuat bahwa C # jauh lebih kuat terkait dengan Microsoft daripada Java untuk Oracle (atau ke Sun di masa lalu).
Giorgio
3

Bagaimana dengan "Kerangka Pengembangan Perangkat Lunak Yang mana, yang mencakup bahasa pemrograman" yang lebih baik?

Anda lupa memasukkan hal-hal lain, seperti "lingkungan" tempat Anda bekerja.

  1. Apakah Anda akan bekerja hanya untuk OS Windows, tetapi, tidak harus tingkat rendah, dan memiliki banyak memori dan sumber daya lainnya?

    Pilih .NET sebagai framework di atas Windows, dan gunakan C #.

  2. Apakah Anda akan bekerja hanya untuk Windows, tetapi, tidak harus tingkat rendah, TETAPI, tidak memiliki banyak sumber daya?

    Pilih Kerangka Kerja Delphi (dan bahasa pemrograman Objek Pascal Delphi atau bahasa pemrograman Paskah Objek Lazarus)

  3. Apakah aplikasi Anda. diperlukan untuk mendukung beberapa platform, seperti game, di ponsel yang berbeda?

    Pilih Java Framework, dan bahasa pemrograman Java.

  4. Apakah Linux dengan KDE sebagai antarmuka grafis?

    Pilih kerangka kerja QT, dengan C ++

  5. Apakah Linux dengan Gnome sebagai antarmuka grafis?

    Pilih kerangka GObject / GLib, dengan C ++

  6. Apakah Anda akan bekerja dengan banyak operasi tingkat rendah, seperti mengembangkan driver?

    Plain C atau C ++ digunakan untuk beberapa Sistem Operasi, dengan pustaka standar, sebagai framework.

Hanya 2 sen saya.

umlcat
sumber
1
Saya tidak yakin tentang 3. Smartphone sangat populer saat ini dan AFAIK, semuanya mendukung C # dalam beberapa bentuk, tetapi hanya Android yang mendukung Java.
svick
Bukankah Delphi sudah mati? :)
šljaker
@ šljaker Tidak, tapi, ini bukan hari-hari tesis yang sangat populer.
umlcat
1
@vick: Itu bohong. Selain Android, Java juga ada dalam beberapa bentuk di iOS, Symbian, WinMo, Blackberry, Maemo, dan WebOS (yaitu semua yang penting atau masih penting; jangan mulai dengan platform yang lebih kecil). Android, Blackberry, dan Symbian secara resmi mendukung Java sebagai opsi pengembangan; Sun dulu mendukung Java di iOS bahkan ketika Apple tidak menyukainya. Java adalah bahasa pengembangan utama dalam ponsel Android dan Blackberry. Saya tidak bisa mengatakan hal yang sama dengan C #, AFAICT hanya didukung secara resmi di WinMo.
Lie Ryan
1

Jika Anda melakukan pencarian, Anda mungkin akan menemukan diskusi tentang bahasa pemrograman top. Berikut adalah salah satu hasil pencarian - http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html - Java tampaknya masih menjadi bahasa yang paling populer.

Java mencoba untuk menghilangkan beberapa kekurangan C ++ (dan membuat hidup para programmer lebih mudah untuk aplikasi non-real-time dan non-critical). C # menjadi pendatang baru ke pesta, menghindari beberapa kekurangan bahasa Jawa. C # telah membuat banyak kemajuan (karena Microsoft memiliki banyak kendali atas itu) sementara kemajuan di Jawa diblokir untuk periode waktu yang cukup lama karena konflik di antara para pemangku kepentingannya.

Satyajit
sumber
1

Beberapa hal yang belum disebutkan:

C # lebih baik daripada C ++ karena:

Itu tidak jauh dengan file header, yang diterjemahkan dengan sangat sederhana.

C # lebih baik daripada Java karena:

Ini mendukung kedua tipe referensi (kelas) dan tipe nilai (struct) tipe yang ditentukan pengguna, yang, jika Anda tahu apa yang Anda lakukan, dapat menghasilkan manfaat kinerja yang signifikan.

Ini mendukung delegasi, yang seperti antarmuka metode tunggal, sehingga sangat menyederhanakan pengkodean konstruksi yang sering terjadi yang melibatkan objek metode tunggal.

Mike Nakis
sumber
Bisakah Anda menjelaskan dengan cara apa tipe tipe referensi dan tipe nilai dapat menghasilkan manfaat kinerja dalam C #?
Giorgio
Misalnya, jika Anda ingin memiliki array catatan, di Jawa Anda tidak memiliki pilihan selain untuk menggambarkan catatan Anda menggunakan kelas, sehingga array Anda akan menjadi array referensi ke banyak objek yang dialokasikan secara terpisah. Dalam C # Anda dapat menggambarkan catatan Anda menggunakan struct, sehingga array Anda akan menjadi hanya satu area memori yang mengandung struktur Anda satu demi satu, seperti dalam C.
Mike Nakis
Sebagai contoh lain, jika Anda ingin mendefinisikan tipe baru yang kecil, (tipe yang cocok dengan kata mesin), Anda tidak harus mendefinisikan kelas baru untuknya; Anda bisa membuatnya menjadi sebuah struct, jadi itu akan mematuhi nilai semantik. Melewati struct semacam itu di sekitar tidak akan lebih mahal daripada melewati referensi ke objek, tetapi Anda akan mendapat manfaat dari tidak mengalokasikan, membangun, dan mengumpulkan sampah objek apa pun.
Mike Nakis
Saya mengerti. Jadi kelas dipakai di heap dan diakses melalui referensi sementara struct di instantiated di stack (?)
Giorgio
Hampir benar. Satu-satunya ketidakakuratan dalam pernyataan ini adalah bahwa struct akan ditemukan di heap jika itu tertanam di dalam objek lain, atau jika itu di dalam array struct. Dan itu juga akan ditemukan di heap jika itu pernah kotak, dengan cara yang persis sama seperti tipe nilai kotak di Jawa.
Mike Nakis
1

Anda harus memilih bahasa terbaik untuk lingkungan yang Anda harapkan dan keahlian Anda.

Pilih C # jika Anda bekerja di lingkungan khusus Microsoft. Sementara C # distandarisasi di bawah ISO / IEC 23270: 2003, versi Microsoft tetap satu-satunya implementasi yang lengkap. Beberapa bagian penting dari bahasa ini tidak tercakup oleh standar dan karenanya tunduk pada paten Microsoft. Tidak ada orang lain yang akan mengimplementasikan versi bahasa yang sepenuhnya kompatibel untuk sistem lain, jadi pada dasarnya, Anda adalah vendor yang terkunci pada Microsoft Windows dan .Net selama Anda menggunakan bahasa tersebut. Jika Anda mencari keterampilan untuk digunakan di pasar seluler, lebih baik melihat ke bahasa lain.

Java berfungsi, tetapi memiliki banyak overhead, sebagian karena fitur seperti pengumpulan sampah. Java juga tidak distandarisasi oleh ISO / IEC, jadi Anda tidak memiliki jaminan jika Anda beralih platform dan versi Java, hanya niat terbaik Sun / Oracle. Jika pada akhirnya Anda berencana untuk bekerja dengan Android, ini jelas cara yang harus dilakukan. Pemrograman Android pada dasarnya adalah Java, dengan beberapa perubahan.

C ++ distandarisasi dan hampir semua penyusun mengikuti standar internasional, jadi Anda menjamin perilaku tetapi bahasa tidak melindungi Anda dari diri sendiri. Anda harus melakukan pemeriksaan pembersihan dan limpahan sendiri. Ini tidak sulit. Pemrogram C / C ++ telah melakukan ini selama bertahun-tahun. Apple menggunakan Objective C untuk semuanya, jadi jika Anda ingin membidik Apple, saya sarankan Anda untuk mencoba ini.

Jika Anda melihat diri Anda meninggalkan Windows di beberapa titik, saya sarankan belajar C / C ++ dan Java - keduanya dapat dipasarkan saat ini.

TJ
sumber
0

Sehubungan dengan C ++ vs C # (karena saya tidak cukup mahir di Jawa), apa yang saya lewatkan di sini adalah kemampuan untuk mengakses hal-hal tingkat rendah pada Windows. Misalnya, Anda tidak dapat mengembangkan driver tampilan asli di C # (belum), tetapi Anda bisa dengan C ++. Ini tidak membuat C ++ lebih baik. Saya melihat C ++ versus C # sebagai Majelis versus C.

C # menurut saya jauh lebih efisien jika Anda melihat waktu yang diperlukan untuk benar-benar mengimplementasikan fitur. Denda kinerja runtime. Net diabaikan untuk 99% dari aplikasi yang dikembangkan. Mungkin penting jika Anda menjalankan loop ketat, ya dengan segala cara, tetapi sebagian besar waktu aplikasi idle, menunggu segala jenis input, sinyal atau interupsi (disk IO, klik tombol, jaringan, penyelesaian animasi) .

Perpustakaan CLR dengan semua fungsinya memiliki manfaat besar lainnya. Ketika saya melatih C # untuk pengembang junior, kebanyakan dari mereka mengatakan mereka menyukai konvensi penamaan kelas, anggota dan ruang nama yang logis. Menemukan fitur metode logis di SDK, sesuatu yang Visual Basic 5 cacat serius. Ini sangat membantu mereka dalam mengadopsi perpustakaan. Setelah mempelajari sintaks suatu bahasa, mempelajari perpustakaan baru sangat penting untuk memahami SDK apa pun. Ini menyelamatkan Anda dari menciptakan kembali roda.

Rob van der Veer
sumber