З яких причин я повинен вибрати C # над Java та C ++? [зачинено]


46

Здається, C # користується популярністю в наші дні. Я чув, що синтаксично це майже те саме, що і Java. Java та C ++ існують уже давно. З яких причин я повинен вибрати C # над Java та C ++?


16
Як написано, це питання був прикладом підручника не конструктивного "яка мова краща?" питання, які тут не тематичні. Я намагався зробити це більш конструктивним за допомогою редагування, оскільки він насправді отримав хороші, продумані відповіді. Однак, будь ласка, пам’ятайте про поширені запитання та цю публікацію в блозі , коли задаєте такі питання.
Адам Лір

Дозвольте додати кілька більш елегантних елементів. .NET має чітко визначений DOM ( наприклад, CodeDOM ) для своєї мови, а отже, динамічно створювати речі під час виконання - це набагато простіше та ефективніше. Це також може бути корисним як інфраструктурна спроможність. Крім того, система типів має відповідність 1 на 1 зі всіма рідними типами W3. По суті, W3 та інші інтеропи були викладені мовою з самого початку. Щодо інших мов, то це питання було просто зафіксовано, і вони представляють багато проблем. Крім того, якщо ви будете взаємодіяти з багатьма мовами та / або протоколами, тоді .NET дуже сильний
JoeGeeky

5
Гей, JoeGeeky, додай свій коментар як відповідь на запитання.
Ентоні Мастрен

1
Справжні запитання: з яких причин я повинен вибрати Nemerle, F * і F # над C #? (тобто всі три мови - з MS, і всі три - кращі)
mrsteve

Я дійсно не вважаю, що будь-яке твердження жанру "мова / платформа X порівняно з мовою / платформою Y ЗАВЖДИ краще" є дійсним, і я також вважаю, що для будь-яких X і Y це може бути недійсним для певних контекстів. У чому сенс цього питання?
Shivan Dragon

Відповіді:


76

Питання повинно бути "Яка мова найкраще підходить для сучасної типової розробки додатків?".

Редагувати: я звернувся до деяких коментарів нижче. Невелике зауваження: врахуйте, що коли у вас є багато речей, як ідіоми, це велика різниця, ніж щоразу впроваджувати або завантажувати та використовувати їх. Практично все можна реалізувати на будь-якій з цих мов. Питання в тому, - які мови вам споконвічно надають.

Тож у верхній частині голови (деякі аргументи стосуються обох мов) ...

C # краще, ніж C ++ тим, що:

  • У ньому є рідне сміття.
  • Це дозволяє розглядати підписи методів класу як вільні функції (тобто ігнорування статично набраного thisаргументу вказівника), а отже, створювати більш динамічні та гнучкі відносини між класами. відредагуйте, якщо ви не знаєте, що це означає, то спробуйте призначити член-метод, який повертає недійсність і приймає недійсність void (*ptr)()змінній. Делегати C # несуть thisвказівник із собою, але користувачеві не завжди потрібно про це дбати. Вони можуть просто призначити void()метод будь-якого класу будь-якому іншому void()делегату.
  • У ньому є величезна стандартна бібліотека з такою кількістю корисних речей, які добре реалізовані та прості у використанні.
  • Це дозволяє як керовані, так і нативні блоки коду.
  • Версія для складання легко усуває проблеми пекла DLL.
  • Ви можете встановити класи, методи та поля, які є внутрішніми для збирання (це означає, що вони доступні з будь-якого місця в DLL, в якому вони оголошені, але не з інших збірок).

C # кращий за Java в тому, що:

  • Замість великого шуму (EJB, приватні реалізації статичних класів тощо) ви отримуєте елегантні та привітні натурні конструкції, такі як "Властивості" та "Події".
  • У вас є справжні дженерики (не поганий жарт із кастингу, який Java називає генеріком), і ви можете виконати роздуми над ними.
  • Він підтримує власні ідіоми управління ресурсами ( usingтвердження). Java 7 також підтримає це, але C # мав це ще довший час.
  • У ньому немає перевірених винятків :) (спірне питання, добре чи погано)
  • Це глибоко інтегровано з Windows, якщо це саме ви хочете.
  • Він має Lambdas та LINQ, тому підтримує невелику кількість функціонального програмування.
  • Це дозволяє як явну коваріацію, так і протиріччя.
  • У ньому є динамічні змінні, якщо ви хочете їх.
  • Краща підтримка перерахування, з yieldтвердженням.
  • Це дозволяє визначати нові значення (або нереференційні) типи.

Редагувати - Адресація коментарів

  • Я не сказав, що C ++ не підтримує рідний RAII. Я сказав, що у Java цього немає (потрібно явно зробити спробу / нарешті). C ++ має автоматичні вказівники, які чудово підходять для RAII, і (якщо ви знаєте, що ви робите), також можна замінити сміття.
  • Я нічого не говорив про емуляцію вільних функцій. Наприклад, якщо вам потрібно отримати доступ до поля за допомогою thisвказівника та прив’язати метод, який робить це, до загальної функції вказівника (тобто не в тому ж класі), просто немає рідного способу зробити це. У C # ви отримуєте безкоштовно. Вам навіть не потрібно знати, як це працює.
  • Під "трактуванням методів-членів як вільних функцій" я мав на увазі, що, наприклад, ви не можете прив'язувати метод власного члена до підпису вільної функції, оскільки метод-член "таємно" потребує thisвказівника.
  • usingТвердження, очевидно , поряд з IDisposable обгорток, є відмінним прикладом RAII. Дивіться це посилання . Вважайте, що RAII вам не потрібен стільки в C #, скільки в C ++, оскільки у вас є GC. У конкретний час, коли вам це потрібно, ви можете явно використовувати usingоператор. Ще одне невелике нагадування: звільнення пам'яті - дорога процедура. У багатьох випадках GC має перевагу в роботі (особливо коли у вас багато пам'яті). Пам'ять не просочиться, і ви не будете витрачати багато часу на розмову. Більше того, розподіл також швидше, оскільки ви не виділяєте пам'ять кожного разу, лише раз у раз. Виклик newпросто збільшує покажчик останнього об'єкта.
  • "C # гірше тим, що він має сміття". Це дійсно суб’єктивно, але, як я вже зазначив вгорі, для більшості сучасних, типових розробок додатків збирання сміття - це одне пекло переваги.
    У програмі C ++ ваш вибір полягає в тому, щоб керувати пам’яттю вручну, використовуючи newі delete, що емпірично завжди призводить до помилок тут і там, або (з C ++ 11) ви можете користуватися автоматичними вказівниками на всьому світі, але майте на увазі, що вони додають багато і багато шуму до коду. Таким чином, GC все ще має перевагу.
  • "Загальна версія набагато слабша за шаблони" - я просто не знаю, звідки ти це взяв. Шаблони можуть мати свої переваги, але, на мій досвід, обмеження, загальна перевірка типів параметрів, протиріччя та коваріантність - це набагато сильніші та елегантні інструменти. Сила шаблонів полягає в тому, що вони дозволяють вам трохи пограти з мовою, що може бути круто, але також викликає багато головних болів, коли ви хочете щось налагодити. Так що загалом, шаблони мають свої приємні риси, але я вважаю, що дженерики є більш практичними та чистими.

5
А якщо ви все ще хочете збирати сміття для C ++, можете завантажити його .
fredoverflow


6
Ще одна важлива особливість у C # порівняно з Java, з міркувань продуктивності, - це "структура", тип об'єкта, який може зберігатися у стеку (або в регістрах процесора, в особливих випадках) або вбудовуватися в інші об'єкти купи. Їх часто використовують для невеликих об'єктів з 1-4 полями, наприклад, координатні пари X, Y.
Qwertie

2
@ ЛокіАстарі Розум пояснює? Поки ви пам’ятаєте відреєстрацію обробників подій та використання шаблону розпорядження на класах, які містять вбудовані обгортки, у вас все буде добре. Це набагато менше знати і запам’ятовувати, ніж управління пам’яттю в C ++.
Ям Маркович

2
-1 оскільки я пропускаю розділи "C ++ краще, ніж C # у тому ..." та "Java краща за C # ...". Я не думаю, що C # є кращим у всіх областях, тому для відповіді без цих двох розділів, мабуть, не вистачає важливої ​​інформації.
Джорджіо

30

Середовище

.NET Framework та клієнти Windows

Windows є домінуючою операційною системою на клієнтських комп'ютерах. Найкращі рамки графічного інтерфейсу для додатків Windows - це Winforms та WPF разом із .NET Framework . Найкраща мова програмування для роботи з .NET Framework та її API - це C # . Java не є альтернативою для цього. А C ++ - це більш давня мова без автоматичного управління пам'яттю. C # схожий на C ++, але має автоматичне управління пам'яттю, і вам не доведеться працювати з покажчиками, які роблять вас більш продуктивними. C ++ все ще може бути найкращим варіантом для деяких випадків, але не для додатків із великими формами баз даних, що є звичним для бізнесу.

IIS та Windows Server

Якщо ви звикли працювати в середовищі Windows та з C #, вам знадобляться найменші інвестиції для вивчення IIS для програмування на сервері та Windows Server для базового адміністрування.

Active Directory та Windows Server

Якщо ви розробляєте програмне забезпечення, яке планується розгорнути в мережах компанії, можливо, вони використовують середовище, орієнтоване на Windows, за допомогою сервера Windows з Active Directory. У такому середовищі легко інтегрувати та розгортати рішення, створене в C # та .NET Framework .

Особисто я розробник Java, а не розробник C #, але працюю з Інтернетом. Я перейшов би на C #, якби розробляв мережеві програми для мережі Windows. Але я віддаю перевагу Java для веб-серверів на базі Linux. Я б вибрав C ++ для вбудованих систем, якщо я не буду багато залежностей.

Так, C # - краща мова з більш сучасними функціями, ніж C ++ та Java, але це не найважливіше для вибору C # .

Підсумок

Середовище вашого програмного забезпечення є найважливішим для вибору C # . Якщо ви працюєте в середовищі з клієнтами Windows, серверами Windows, Active Directory, IIS і, можливо, SQL Server, тоді C # - це найкраща мова з .NET Framework .

Якщо ви працюєте в середовищі Unix, наприклад, з веб-сервісами, Java буде моїм вибором. І якщо ви працюєте з вбудованими системами або вам доведеться інтегруватися з апаратними пристроями, C ++ був би хорошим вибором.


3
Абсолютно - саме тому я використовую C # насправді не будь-яку іншу причину
Мерф

Ви, звичайно, можете використовувати .NET на інших платформах через Mono, MonoTouch та MonoDroid, але мої орієнтири визнали Mono значно повільнішим, ніж .NET для Windows, а власний Compact Framework Microsoft надзвичайно повільний для Windows CE: codeproject.com/KB/cross -platform / BenchmarkCppVsDotNet.aspx ... звичайно, WPF доступний лише в Windows (але мені це все одно не подобається.)
Qwertie

Які залежності ви маєте на увазі, які "я б вибрав C ++ для вбудованих систем, якби я не мав багато залежностей". Ви маєте на увазі бібліотеки java?
Puckl

@Puckl так, але в основному jvm / jre.
Йонас

"Якщо ви працюєте в середовищі Unix, наприклад, з веб-сервісами", існують деякі інші мови та рамки, які можна розглядати: ruby, Python, node.js тощо
MarkJ

15

C # і Java

C # - дуже гарна мова, якщо:

  • Ви хочете зробити об'єктно-орієнтовану розробку загального призначення. Це класична, статично набрана мова OOP.
  • Ви орієнтовані лише на платформи Microsoft (варто пам’ятати, що Microsoft ефективно клонував Java для створення C #, оскільки вони хотіли мови, схожого на Яву, що замикає людей у ​​Windows. Вони могли використовувати Java, але це дозволило б людям легко запускати програми на інші платформи ....)

C # як мова є кращою, ніж Java різними способами (кращий синтаксис властивостей, типів значень, змінених дженериків тощо). Я віддаю перевагу C # як мову Java, але у грандіозній схемі речей вони досить схожі мови і підходять для подібних програм.

З іншого боку, Java має і деякі великі переваги:

  • Величезна екосистема з відкритим кодом - бібліотеки для Java, які ви можете отримати безкоштовно, є на сьогодні найкращими з будь-якої мови. Важко це перебільшувати важливість цього - з точки зору того, як все робити, Java дуже ефективна.
  • Інструменти - інструменти Java, на мій погляд, кращі за те, що ви можете отримати у світі .Net. наприклад, Maven (як тільки ви це освоїли!) особливо вражає.
  • Ремонтопридатність - Java існує деякий час і успішно розвивається у великих компаніях саме тому, що вона є відносно стабільною і багато зусиль докладено до зворотної сумісності. Простий і злегка багатослівний синтаксис також допомагає Java тут - простіше читати та підтримувати код, якщо код дуже чіткий і явний.
  • Нові мови - JVM має нові дивовижні нові мови (Scala, Clojure, Groovy тощо), які є майбутнім платформи Java. Тут відбувається більша частина мовних інновацій, і це відбувається набагато швидше, ніж у Java чи C #.

Тож Java проти C # - це дуже близький дзвінок, і він дійсно зводиться до того, чи хочете ви перебувати в таборі Microsoft чи таборі з відкритим кодом / міжплатформою.

Особисто я віддаю перевагу Java, тому що:

  • На мою думку, екосистема бібліотеки набагато важливіше, що той факт, що C # має кращий синтаксис, ніж Java
  • Зрештою, я хочу, щоб весь мій код був належним чином крос-платформним і міг працювати на великих кластерах дешевих Linux-серверів у хмарі.
  • Clojure - це IMHO - найперспективніша мова у світі зараз, і якщо я буду дотримуватися платформи JVM, я зможу з часом легко перенести свій код і навички в Clojure.

C / C ++

C / C ++ - це взагалі інший звір цілком. Я б не рекомендував його сьогодні для розробки додатків загального призначення з наступних причин:

  • Управління пам'яттю - для програмування загального призначення в даний час ви не хочете керувати власною пам'яттю. Збір сміття на C # або Java набагато кращий для вашої продуктивності та розумності, ніж будь-який з явних методів управління пам'яттю, який вам доведеться використовувати в C / C ++
  • Складність - зокрема, C ++ - надзвичайно складна мова. Освоювати потрібно багато часу, і сам код також може бути нелегко складним. (Наприклад, шаблони C ++ особливо волохаті ....)
  • Продуктивність - більшу частину часу та при інших інших рівнях знадобиться більше часу, щоб зробити завдання C / C ++.

Однак це, безумовно, великий вибір у певній обмеженій кількості спеціальних доменів, зокрема:

  • Операційні системи - можливо, ви хочете використовувати C / C ++, якщо ви пишете операційну систему.
  • Розробка ігор - майже всі найкращі комерційні ігрові двигуни - це C / C ++. Це все-таки найкращий вибір, якщо ви розробляєте вимогливий титул AAA (C # і Java ідеально підходять для менш вимогливих / випадкових ігор)
  • Високопродуктивні обчислення - оптимізований C / C ++ - це, мабуть, найкращий спосіб створити дуже високопродуктивний код. Для більшості програм, які роблять цей рівень оптимізації, не варто докладати зусиль, але в деяких областях це може бути надзвичайно цінним (наприклад, торгівля високими частотами)
  • Апаратний доступ - Вам потрібен прямий доступ до обладнання (наприклад, для вбудованої системи)

Таким чином, C / C ++ є прекрасним вибором, якщо і лише якщо ви зосереджені на одному з доменів, де це особливо добре підходить.


1
Ви згадуєте maven як приклад кращих інструментів для Java. Я не особливо знайомий з цим, але дивлячись на документацію, Мейвен виглядає суворіше подібним до рідного .Net build tool MSBuild. Що робить Maven кращим за MSBuild?
Кевін Каткарт

1
+! (тільки тому, що у мене є лише один голос): ви дуже добре пояснили, чому екосистема Java краща і чому не слід порівнювати лише синтаксис C # проти Java. У Java є більше і кращі бібліотеки та інструменти. У самій мові Java мало що відбувається, але для JVM з'являються нові дуже цікаві мови, які (IMO) набагато цікавіші, ніж C #. Я не знаю Clojure, але мені здається, що Скала дуже цікавий: розроблений для того, щоб OOP + FP був з самого початку.
Джорджіо

2
чому всі вважають, що код C ++ є повним ручним управлінням пам'яттю. Це не ви знаєте, RAII означає, що вам майже ніколи не доведеться вручну виділяти / звільняти пам'ять (час, коли ви це робите, - це те, коли мова, як C #, була б вам марною).
gbjbaanb

3
@gbjbaanb - можливо, тому, що RAII недостатньо для управління пам'яттю загального призначення. Це ні в якому разі не гнучкість до повноцінної системи GC, як ви бачите на Java або C #. Як тільки ви виходите за межі RAII, ви знову перебуваєте на території управління пам’яттю вручну.
мікера

3
@mikera Просто хочу зазначити, що на платформі .NET також існує досить багато мовних розробок. Наприклад, F # - це чітка функціональна мова, яка плавно інтегрує решту .NET, а Python нещодавно перейшов у .NET як Iron Python (і отримав приємний IDE !).
ikh

13
I heard that syntactically they are almost the same.

Синтаксично? Хто дарує літаючих мавп про синтаксис? Синтаксис хороший лише для одного: дозволяє швидше перейти з синтаксично схожих мов. Це воно.

C # набагато краще, ніж Java. Розглянемо їх загальну та функціональну підтримку програмування - C # набагато випереджає Java. Не кажучи вже про перевантаження операторів, та інші хороші речі - C # набагато кращі. Немає можливості, щоб Java могла вважатися кращою за C #.

C ++ і C # - це більше змагання. C ++ має неймовірно дратівливу архаїчну модель компіляції та купу застарілих захворювань від C, але шаблони її набагато потужніші, ніж дженерики, і підходи до управління ресурсами в цілому набагато гнучкіші та потужніші, як usingі повний збій, і він виконує швидше.


6
Я думаю, що слід порівнювати як мовні особливості, так і доступність мови на різних платформах. З C # one заблоковано в Microsoft, а з Java - ні: це велика перевага, принаймні для розробників UNIX / Linux. OOP + FP - це цікаві функції, але навіщо турбуватися про C #, якщо ви можете використовувати Scala, який працює на JVM і може взаємодіяти зі застарілим кодом Java? Я б ніколи не вивчав мову, що відповідає конкретній платформі, якщо мене не змусять.
Джорджіо

2
@Giorgio: Проект Mono існує. Але по-друге, Microsoft насправді піклується про їх платформу - вони регулярно її модернізують. У Java майже не було нічого нового. Також питання стосується C # проти Java, а не CLR проти JVM.
DeadMG

4
@DeadMG: Наскільки я знаю, я не можу прийняти жодну програму C #, розроблену в Windows, і створити її за допомогою Mono. Не CLR проти JVM? Питання в тому, чому люди використовують C # або Java. Щоб люди могли використовувати мову, вони потребують часу виконання та операційної системи. Я не обговорюю те, що C # має більше можливостей, ніж Java, але Java набагато портативніша: це фактор, який може впливати на прийняття мови. Насправді Java все ще використовується набагато частіше, ніж C #, навіть якщо їй не вистачає певних розширених функцій.
Джорджіо

3
@Giorgio, ви можете взяти будь-яку програму C # і створити її за допомогою Mono. Ви не можете використовувати певні бібліотеки (які все одно не є частиною мови C #). І java не "набагато портативніша". Ви можете кодувати iOS в C #, але не в Java, наприклад.
SK-логіка

2
@Giogio, Mono принаймні такий же портативний, як JVM.
SK-логіка

7

Добре C#має деякі приємні вбудовані функції, такі як LINQі делегати. Це отримує найкраще з обох світів - Javaі C++. Подивіться тут для повного порівняння.

Але мені більше подобається Javaсвіт - набагато більше фреймворків з відкритим кодом, і він працює на кожній платформі. І не кажіть мені про Monoце - це не надійний варіант.


9
+1: "Але мені більше подобається світ Java - набагато більш відкриті рамки, і він працює на будь-якій платформі". Будемо сподіватися, що Oracle цього не змінить!
Джорджіо

15
Розумійте, що не є "надійним" у Mono?
SK-логіка

2
@ Петар Мінчев, це не що інше, як ваша вина. Ви повинні дотримуватися вказівок щодо портативності та не використовувати бібліотеки, що не переносяться, - і таким чином будь-яке складне додаток надійно працюватиме з Mono. Такі речі, як WPF, ніколи не будуть перенесені.
SK-логіка

2
@ Петар Мінчев, там є багато не портативних бібліотек Java. Ви завжди повинні бути обережними щодо портативності, незалежно від мови, якою ви користуєтесь. І все одно, питання стосується мов, а не сторонніх бібліотек.
SK-логіка

3
@ Петар Мінчев, GTK # портативний. Використовуйте замість цього.
SK-логіка

3

За деякими джерелами (див., Наприклад, http://www.indeed.com/jobtrends ), C # все ще менш популярний, ніж Java, і такий же популярний, як C ++.

C # надає функції, яких не вистачає Java, наприклад пряма підтримка певних ідіом програмування, таких як властивості, функціональний стиль програмування тощо. C # має більш високий рівень абстракції, ніж C ++, що є перевагою, коли час розробки важливіше швидкості програми.

Особисто я все ще віддаю перевагу світам Java / C ++. Як сказав Петро Мінчев, у Java є більше фреймворків та програм із відкритим кодом, вона працює скрізь, менш прив’язана до конкретного постачальника та операційної системи. C ++ має подібні переваги, хоча код часто потребує адаптацій, що переходять з однієї платформи на іншу. Оскільки я вважаю за краще розвиватися в Linux і, наскільки мені відомо, я не можу повноцінно працювати на C # в Linux, я ніколи не відчував реального інтересу до C #, оскільки мої потреби в програмуванні покриваються на C, C ++, Java, Scala.

З іншого боку, для багатьох розробників прив’язаність до конкретного постачальника не є проблемою: Microsoft займає домінуюче становище на ринку операційної системи, а C # дає багато можливостей для роботи. Тому багато розробників IMO приймають C #, тому що, крім того, що вона є мовою, багатою функціями, вона також є хорошою інвестицією.


"Я не можу повністю розробити C # на Linux" - Не могли б ви детальніше розповісти про це? Ви маєте на увазі, що повний .Net фреймворк недоступний, оскільки я не стикався з жодними проблемами із самим мовою C # (або F # з цього приводу) в Linux?
Wesley Wiser

@wawa: Наскільки мені відомо, .Net Framework відповідає JDK, а .Net Framework доступний лише для Windows, тоді як JDK доступний для декількох ОС. Якщо це неправильно, я можу змінити свою відповідь (і змінити свою думку).
Джорджіо

1
Я думаю, що більш близькою аналогією була б Бібліотека базового класу до JDK. BCL має стандартизовані та нестандартні деталі. Монопроект реалізує як стандартизовані, так і більшість нестандартних творів.
Wesley Wiser

@wawa: Дякую за інформацію. Я розглядаю можливість спробувати C # за допомогою Mono. Однак у мене все ще є досить сильне відчуття, що C # набагато сильніше прив’язаний до Microsoft, ніж Java до Oracle (або до Sun у минулому).
Джорджо

3

А як щодо "Яка рамка розробки програмного забезпечення, яка включає мову програмування"?

Ви забули включити інші речі, наприклад, "оточення", з яким ви будете працювати.

  1. Ви збираєтеся працювати лише для ОС Windows, але це не повинно бути низьким рівнем та мати багато пам’яті та інших ресурсів?

    Виберіть .NET як основу для Windows та використовуйте C #.

  2. Ви збираєтеся працювати тільки для Windows, але це не повинно бути низького рівня, АЛЕ не має багато ресурсів?

    Виберіть рамку Delphi (та мову програмування Object Pascal Delphi або мову програмування Lazarus Object Pascal)

  3. Ваш додаток. необхідна для підтримки декількох платформ, як гра, в різних мобільних телефонах?

    Виберіть Java Framework та мову програмування Java.

  4. Це Linux з KDE як графічний інтерфейс?

    Виберіть рамку QT за допомогою C ++

  5. Це Linux з Gnome як графічний інтерфейс?

    Виберіть рамку GObject / GLib, використовуючи C ++

  6. Ви збираєтесь працювати з багатьма операціями на низькому рівні, як, наприклад, розробляти драйвери?

    Звичайний C або C ++ використовується для декількох операційних систем, зі стандартними бібліотеками, як рамки.

Всього мої 2 копійки.


1
Я не впевнений щодо 3. Смартфони сьогодні дуже популярні та AFAIK, усі вони підтримують C # в якійсь формі, але лише Android підтримує Java.
svick

Хіба Дельфи не померла? :)
šljaker

@ šljaker Ні, але, це не дуже популярні дні тез.
umlcat

1
@svick: Це брехня. Крім Android, Java також існують у певній формі на iOS, Symbian, WinMo, Blackberry, Maemo та WebOS (тобто все, що має значення чи все ще має значення; не запускайте мене з ще меншими платформами). Android, Blackberry та Symbian офіційно підтримують Java як варіант розробки; Sun використовував підтримку Java на iOS навіть тоді, коли Apple цього не любить. Java є основною мовою розробки в телефоні Android та Blackberry. Я не можу сказати те саме з C #, AFAICT це підтримується лише офіційно на WinMo.
Лежать Раян

1

Якщо ви здійснюєте пошук, ви, швидше за все, натрапите на обговорення основних мов програмування. Ось один із результатів пошуку - http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html - Java як і раніше є найбільш популярною мовою.

Java намагалася усунути деякі недоліки C ++ (і полегшила життя програмістів для нереального та некритичного програм). Будучи пізнім учасником вечірки, C # уникає деяких недоліків мови Java. C # досягла значного прогресу (оскільки Microsoft має великий контроль над нею), тоді як просування в Java було заблоковано протягом значного періоду часу через конфлікт між її зацікавленими сторонами.


1

Пару речей, про які вже не було сказано:

C # краще, ніж C ++, оскільки:

Це усуває файли заголовків, що означає велику простоту.

C # краще, ніж Java, тому що:

Він підтримує типи, визначені користувачем, як опорний (клас), так і ціннісний (структура), який, якщо ви знаєте, що ви робите, може принести значні переваги продуктивності.

Він підтримує делегатів, подібних до однометодних інтерфейсів, що значно спрощує кодування часто зустрічаються конструкцій, що включають однометодні об'єкти.


Чи можете ви пояснити, яким способом використання типів еталонного та типового типу може принести переваги ефективності в C #?
Джорджіо

Наприклад, якщо ви хочете мати масив записів, у Java у вас немає іншого виходу, крім як описати свою запис за допомогою класу, тому ваш масив буде масивом посилань на безліч окремо виділених об'єктів. В C # ви можете описати свій запис за допомогою структури, тому ваш масив буде лише єдиною суцільною областю пам’яті, що містить ваші структури одна за одною, так само, як у C.
Майк Накіс

Як інший приклад, якщо ви хочете визначити невеликий новий тип (тип, який би вписувався в машинне слово,), вам не потрібно визначати для нього новий клас; ви можете просто зробити її структурою, тому вона буде підкорятися значенням семантики. Передача таких конструкцій навколо не буде дорожчою, ніж передача посилань на об’єкти, але ви матимете перевагу не виділяти, не будувати та збирати сміття жодних об’єктів.
Майк Накіс

Я розумію. Тож класи класифікуються на купі та отримують доступ до них за допомогою посилань, тоді як структури інстанціюються на стеці (?)
Джорджіо

Майже правильно. Єдина неточність у цьому твердженні полягає в тому, що структура буде знайдена на купі, якщо вона вбудована всередині іншого об'єкта або якщо вона знаходиться всередині масиву структур. І він також знайдеться на купі, якщо він коли-небудь потрапить у коробку, точно так само, як у Java розміщені типи значень.
Майк Накіс

1

Ви повинні вибрати найкращу мову для вашої очікуваної обстановки та вашого досвіду.

Виберіть C #, якщо ви працюєте в середовищі лише для Microsoft. Хоча C # стандартизований відповідно до ISO / IEC 23270: 2003, версія Microsoft залишається єдиною повною реалізацією. Кілька ключових частин мови не поширюються на стандарт і тому підпадають під патенти Microsoft. Ніхто інший не буде реалізовувати повністю сумісну версію мови для інших систем, тож фактично ви продавець заблокований у Microsoft Windows та .Net до тих пір, поки не використовуєте цю мову. Якщо ви шукаєте навички використання мобільного ринку, краще зверніться до іншої мови.

Java працює, але має великі витрати, частково завдяки таким особливостям, як збирання сміття. Java також не стандартизована ISO / IEC, тому у вас немає гарантій при переключенні платформ та версій Java, лише найкращі наміри Sun / Oracle. Якщо ви врешті-решт плануєте працювати з Android, це безумовно шлях. Програмування Android в основному Java, з кількома змінами.

C ++ є стандартизованим і майже всі компілятори відповідають міжнародному стандарту, тому ви гарантуєте поведінку, але мова не захищає вас від себе. Ви повинні виконати очищення та перевірку переповнення самостійно. Це не важко. Програмісти C / C ++ роблять це вже багато років. Apple використовує ціль C для всього, тому, якщо ви хочете націлитись на Apple, рекомендую спробувати це замість цього.

Якщо ви побачите, що ви в якийсь момент залишаєте Windows позаду, я б запропонував вивчити як C / C ++, так і Java - обидва з яких зараз продаються.


0

Що стосується C ++ проти C # (оскільки я недостатньо досвідчений в Java), мені тут бракує можливості доступу до матеріалів низького рівня в Windows. Наприклад, ви не можете розробити власний драйвер дисплея в C # (поки), але ви можете з C ++. Це не робить C ++ кращим. Я бачу C ++ проти C # як збірку проти C.

На мою думку, C # набагато ефективніше, якщо подивитися на час, необхідний для реальної реалізації функції. Показник продуктивності виконання .Net виконує незначно для 99% розроблених додатків. Це може бути важливим, якщо ви працюєте в тісному циклі, так, без сумніву, але більшу частину програми програма працює в режимі очікування, очікуючи будь-якого вводу, сигналу або переривання (IO диска, натискання кнопки, мережа, завершення анімації) .

Бібліотека CLR з усіма своїми функціями має ще одну велику перевагу. Коли я навчав C # молодшим розробникам, більшість із них сказала, що їм подобається логічне узгодження імен класів, членів та просторів імен. Пошук функції методу був логічним для SDK, що було серйозно помилкою у Visual Basic 5. Це дуже допомогло їм у прийнятті бібліотеки. Вивчивши синтаксис мови, здобути для вивчення нової бібліотеки є важливим для розуміння будь-якого SDK. Це позбавляє вас від винаходи колеса.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.