Java или C#.NET
Какой язык лучше изучать Java или C#.NET?
Какой язык лучше изучать Java или C#.NET?
C#: operator overloading, properties, value type as method arguments by reference, pointers, virtual methods, static constructors, readonly fields, structures are the main advantages of C# comparing to Java
главное чтобы программист был хороший...
Не ну я имел ввиду стандартный java SDK. А стороннего чего только нету на java:)
Ви б спочатку погуглили, а потім вже б кидалися такими закидами. Схоже на «я ніколи не бачив негрів, значить їх не існує», просто дивує така суб’єктивність.
Ключові слова Hibernate, Criteria, HQL
Iterable< String> productNames = from ( “p” ).in (products). select (“p.getProductName () ”);
Person one = db.from (p). where (p.id.eq (x).and (p.name.eq (name:). get ();
Maxim Stepanenko
LINQ в java ещё нету
Ви б спочатку погуглили, а потім вже б кидалися такими закидами. Схоже на «я ніколи не бачив негрів, значить їх не існує», просто дивує така суб’єктивність.
Я пробовал использовать МОНО как.НЕТ под линуксом. Что вам сказать уж лучьше Ява которой я незнаю.
Пожалуйста, пишите уж лучше на Моно под Линукс. Gtk# хоть нативно выглядит, в отличие от...
Я пробовал использовать МОНО как.НЕТ под линуксом. Что вам сказать уж лучьше Ява которой я незнаю.
Пожалуйста, пишите уж лучше на Моно под Линукс. Gtk# хоть нативно выглядит, в отличие от...
в то время как Java универсальная, а как известно общий метод не лучше кастомного...
Вот и весь выбор.
ребята, если вы не можете отличить java code от С# — не пишите глупости
А ты уверен что я не могу их отличить? Или хамство твоя основная цель? Из того поста мне до сих пор не понятно к чему он относился, автор к сожалению не прояснил этот вопрос.
LINQ в java ещё нетуда и синтаксис совсем разный
Есть такая библиотека quaere.codehaus.org/ Есть соответствующие средства в google-collections API.
а можно коннектиться к IES через JCA, но как было сказано выше (весьма правильно): «LINQ и Hibernate все таки разные вещи»
-
Думаю что LINQ и Hibernate все таки разные вещи. Не путайте с LINQ2SQL. Сам LINQ гораздо шире.
да и синтаксис совсем разный
да и синтаксис совсем разный
Ужас — собрался толпа джуниоров и спорят, как всегда, ни о чём -, а что еще вечным джуниорам остается делать.
Если по теме — язык это всего-лишь инструмент, пробуйте и поймете что лучше для конкретной задачи.
это жесть!!!
IList — это интерфейс
List< string> — это класс из Generic реализующий IList<>вы путаете круглое с кислым)
Да вы наверное правы, я думал вопрос относится к Java коду.
А если «Java VS С#» — то это полный бред, а не тема, ещеб написали «BASIC VS Assembler», балобы весело на форуме =)
По поводу сравнения — IDE для java не понравились тем, что не работал ClearType... Такой я привередливый
это жесть!!!List — это интерфейс, а ArrayList одна из его имлементаций.
вы путаете круглое с кислым)
Позвольте не согласиться...List — это интерфейс (абстрактный класс в С++), а ArrayList одна из его имлементаций.
И я бы не стал сравнивать интерфейс с абстрактным классом, т.к. это несколько некорректно;)
AV будет например если A — это абстрактный класс
А помоему все правильно. Вначале вызывается конструктор родительского класса, и в этот момент обьект-child еще не создан.
return 0; }
Сейчас я работаю в Чикаго, Илинойс. Да да, это мы всех уделали на выборах президента (Обама из Илинойса).))
кстати сорри за офтоп:), а вы из какой части социалистических штатов америки?
а через переопределеные методы передать свойства и параметры...
соответсвенно не создана таблица функций и при вызове метода вы получите AV.
2 junior_dev
f — это функция в зависимости реализации таблицы виртуальных функций в каждом конкретном языке ведб вы понимаете что нужно сделать lookup по этой таблице
это может быть hash или B-tree.
А можно где нибудь про это почитать? Я раньше думал (я профан в низкоуровневых делах), что смещение виртуального адреса конкретной функции в таблице становится известно на этапе линковки/компиляции, и лукап производить не нужно...
В.Net есть валидация указателя для виртуальных функций, поэтому код
class A
{
A ()
{
B (); }
virtual B (){} }
Можно подробнее где там Access Violation, и что тут нужно валидировать? В джава такого помоему точно нету...
В C++ как вы понимаете это код вам скажет Access violation...
2 PomAH4uK
Collections.sort (listOfObjects, new Comparator () {Джавісти зможете показати як ви посортуєте список якихось обєктів по 3 полям? =)
Как то так, а что? Если вы про Linq то в джава мире их есть.
2 sashaeve,
Если мы объявили List< string> — для чего нам ArrayList?
List — это интерфейс (абстрактный класс в С++), а ArrayList одна из его имлементаций.
2 junior_dev
время обращения к методу класса О (1) для виртуальной O (f (длина таблицы виртуальных фнкций) + g (1) — валидация указателя) что куда сложнее — падает производительность...
А откуда взялась f? И что такое «валидация указателя»?
А так можно сделать на C#?Можно будет сделать в C# 4.0 — Ко- и контра-вариантность — msug.vn.ua/...w-features.aspxList< String> stringList = new ArrayList< String> (); stringList.add ( “String” ); List< Integer> integerList = new ArrayList< Integer> (); integerList.add (1);
ИМХО, для кого-то панацея, для кого-то фича, не более. Если мы объявили List< string> — для чего нам ArrayList?
Высокоточные замеры времени в С# средствами.NET — msug.vn.ua/.../11/22/net.aspx
Джавісти зможете показати як ви посортуєте список якихось обєктів по 3 полям? =)
Если просто смотреть на DateTime.Now, то получается C# — ~40 секунд, Java — ~20 секунд. Тоже не правдоподобный результат.
Ticks это не милисекунды, это тики процесора, как вы понимаете при текущих рабочих частотах на одну милисекунду приходиться на порядки больше тиков...
Java (jdk1.6.0_12)
class Methods {
public static void staticMethod() {
}
public void simpleMethod() {
}
public void simpleMethod2() {
}
public final void finalMethod() {
}
}
class SubMethods extends Methods{
public void simpleMethod() {
}
}
public class Test {
public static void main(String[] args) {
System.out.println("num: " + Integer.MAX_VALUE);
long start = System.currentTimeMillis();
for (int i = 0; i < Integer.MAX_VALUE; i++) {
Methods.staticMethod();
}
System.out.println("static Base: " + (System.currentTimeMillis() - start));
Methods methods = new Methods();
start = System.currentTimeMillis();
for (int i = 0; i < Integer.MAX_VALUE; i++) {
methods.finalMethod();
}
System.out.println("final Base: " + (System.currentTimeMillis() - start));
start = System.currentTimeMillis();
for (int i = 0; i < Integer.MAX_VALUE; i++) {
methods.simpleMethod();
}
System.out.println("simple Base: " + (System.currentTimeMillis() - start));
start = System.currentTimeMillis();
for (int i = 0; i < Integer.MAX_VALUE; i++) {
methods.simpleMethod2();
}
System.out.println("simple2 Base: " + (System.currentTimeMillis() - start));
SubMethods subMethods = new SubMethods();
start = System.currentTimeMillis();
for (int i = 0; i < Integer.MAX_VALUE; i++) {
subMethods.simpleMethod();
}
System.out.println("simple Sub: " + (System.currentTimeMillis() - start));
start = System.currentTimeMillis();
for (int i = 0; i < Integer.MAX_VALUE; i++) {
subMethods.simpleMethod2();
}
System.out.println("simple2 Sub: " + (System.currentTimeMillis() - start));
start = System.currentTimeMillis();
for (int i = 0; i < Integer.MAX_VALUE; i++) {
subMethods.finalMethod();
}
System.out.println("final Sub: " + (System.currentTimeMillis() - start));
}
}
Результат:
num: 2147483647
static Base: 3078
final Base: 1937
simple Base: 2907
simple2 Base: 2922
simple Sub: 2906
simple2 Sub: 3797
final Sub: 3593C# (.Net 3.5)
using System;
namespace ConsoleApplication1
{
class Methods {
public static void staticMethod() {
}
public virtual void simpleMethod() {
}
public virtual void simpleMethod2()
{
}
public void finalMethod() {
}
}
class SubMethods : Methods{
public override void simpleMethod() {
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("num: " + Int32.MaxValue);
long start = DateTime.Now.Ticks;
for (int i = 0; i < Int32.MaxValue; i++) {
Methods.staticMethod();
}
Console.WriteLine("static Base: " + (DateTime.Now.Ticks - start));
Methods methods = new Methods();
start = DateTime.Now.Ticks;
for (int i = 0; i < Int32.MaxValue; i++) {
methods.finalMethod();
}
Console.WriteLine("final Base: " + (DateTime.Now.Ticks - start));
start = DateTime.Now.Ticks;
for (int i = 0; i < Int32.MaxValue; i++) {
methods.simpleMethod();
}
Console.WriteLine("simple Base: " + (DateTime.Now.Ticks - start));
start = DateTime.Now.Ticks;
for (int i = 0; i < Int32.MaxValue; i++) {
methods.simpleMethod2();
}
Console.WriteLine("simple2 Base: " + (DateTime.Now.Ticks - start));
SubMethods subMethods = new SubMethods();
start = DateTime.Now.Ticks;
for (int i = 0; i < Int32.MaxValue; i++) {
subMethods.simpleMethod();
}
Console.WriteLine("simple Sub: " + (DateTime.Now.Ticks - start));
start = DateTime.Now.Ticks;
for (int i = 0; i < Int32.MaxValue; i++) {
subMethods.simpleMethod2();
}
Console.WriteLine("simple2 Sub: " + (DateTime.Now.Ticks - start));
start = DateTime.Now.Ticks;
for (int i = 0; i < Int32.MaxValue; i++) {
subMethods.finalMethod();
}
Console.WriteLine("final Sub: " + (DateTime.Now.Ticks - start));
}
}
}
Результат:
num: 2147483647
static Base: 28906250
final Base: 19062500
simple Base: 67343750
simple2 Base: 67343750
simple Sub: 67187500
simple2 Sub: 57968750
final Sub: 19375000
Комментарий: Субъективно Java отработала быстрее P.S. Я не являюсь специалистом по C#. Возможно, DateTime.Now.Ticks НЕ является аналогом System.currentTimeMillis () или код C# неверен впринципе, поэтому просьба поправить если есть какие-то ошибки.
Надо быть честным до конца, редактор кода в IDEA не зря считается одним из лутших на текущий момент (Resharper, те же возможности, только на VS для многих просто мана небесная), но IDE это не только редактор текста, но и многое другое...
Хотя уверенности нет, но думаю на Java платформе нет IDE с такими же возможностями. Если я не прав, поправте...
Подозреваю, что пользователи IDEA до сих пор не ответили потому, что не могут вылезти из под стола от хохота...
итд...
да и в одной известной Гейм-дев конторе при работе с графикой каждый виртуальный метод нужно обосновывать:)
А язык — это своего рода тоже инструмент, который позволяет решать задачи. Плюсов и минусов везде хватает (я не думаю, что Java исключение:))
насчет прохождения по веткам switch, так это специально было сделано, чтобы избежать бОльших проблем. ИМХО этот функционал в С++ приносит больше недорозумений и непонятных багов чем пользы.
Возможно, но в таком случае этот явно указываемый break оказывался лишним (если проваливание в принципе невозможно). Меня смущало именно это, а не отсутствие проваливания как такового.
2 junior_dev: т.е. в Java ваш пример с парсером будет работать одинаково, хотелось бы увидеть в C#... теоретически я согласен, что вызов невиртуального метода должен быть быстрее, но если на практике из-за оптимизаций компилятора, влияния притяжения луны или других факторов разницы не будет — то в чем тогда их полезность?
а вот когда будете писать програму управления крытой ракеты:) то задумаетесь...
отстой это метод который используеться не по назначению..., а все остальное дело вкуса
Разговор заходит в тупик. Не хватает какого-нибудь маньяка, который бы сейчас заявил что C# and Java отстой..., а вот JavaSrcipt!!!:)
и более того вам профайлер это время не покажет, так как в большинстве он засекает время в скопе...
проведите такой тест на C# с виртуальным и невиртуальным методом, интересно
насчет прохождения по веткам switch, так это специально было сделано, чтобы избежать бОльших проблем. ИМХО этот функционал в С++ приносит больше недорозумений и непонятных багов чем пользы.
Console.WriteLine (s);// Не поверите, но результат будет 1
Зовні виглядає, що у даному випадку різниця лише у типових значеннях (якщо не залазити в таблиці віртуальності, оптимізацію і тому подібні глибини компіляторів) — для Java методи типово віртуальні, а для С++/C# — не віртуальні, але і там і там це можна обходити певними синтаксичними конструкціями. І лише справа вподобань, кому що звичніше і зручніше. І це, мабуть, стосується і багатьох інших аспектів обох мов. Свого часу мені в С# не сподобалась необхідність break у кожній гілці switch і відсутність при цьому провалювання. Дрібниця, звісно, але з дрібниць складається імідж.
теперь представим 2 браузера на рынке, один открывает большие документы 5 сек, второй 25, какой вам понравиться больше?
А так можно сделать на C#?
List<String> stringList = new ArrayList<String>();
stringList.add("String");
List<Integer> integerList = new ArrayList<Integer>();
integerList.add(1);
всему свои методы:), а умение выбрать, обосновать и воплотить лучший отличает специалиста от обывателя
в большинстве задач с которыми я сталкивался в Украине это никому не надо...
финализация не решает проблему производительности вызова
{}
Меня пока не убедили в полезности невиртуальных методов:)
Чтобы зарретить переопределять метод, достаточно использовать final.
public final int B()
{
}
во всяком случае создалось такое впечатление, хоть и не берусь утверждать:)
Так же это полезно в случае если вы пишете свой компонент и реализуете подобную схему:
class A
{
public int B()
{
return 2;
}
public void C()
{
if (2 != B())
throw new ApplicationException("uuuuuuuu");
}
}
теперь если вы свой контрол поставили клиенту, а он решил его расширить и случайно переопределил метод B () — в Java это не вопрос и вызвал C ():) то ваш код может рухнуть…
понятно что это простой кейс, но иногда он может обернуться более сложными исследованиями…при возможной декларизации интерфейса вы можете по сути декларировать и ожидать определеные инварианты как для себя так и для пользователя…
но если парсер, то будет повод задуматься.
2smp: у наведеному прикладі, якщо не помиляюсь, несуттєво, огошошувати Print () віртуальним чи ні, оскільки він не наслідуєтсья.
Для порівняння, на Java:
public abstract class BaseClass {
public String Print() {
return VirtualPrint();
}
protected String VirtualPrint() {
return "BaseClass";
}
}
//-------------------------------------------------------------
public class ExtendedClassA extends BaseClass {
}
//-------------------------------------------------------------
public class ExtendedClassB extends BaseClass {
protected String VirtualPrint() {
return "ExtendedClassB";
}
}
Результат виконання той самий:
BaseClass a = new ExtendedClassA();
BaseClass b = new ExtendedClassB();
System.out.println(a.Print()); //Результат: BaseClass
System.out.println(b.Print()); //Результат: ExtendedClassB
Без явного вказання virtual i override. У Java це — типова поведінка, тобто типово всі методи віртуальні. Як на мене, зручно.Наглядніше було б продемонструвати приклад використання НЕвіртуальних методів, як більш нетипову ситуацію (IMHO).
1. нах оно надо?!
Простой пример:
public abstract class BaseClass
{
public string Print()
{
return VirtualPrint();
}
protected virtual string VirtualPrint()
{
return "BaseClass";
}
}
//-------------------------------------------------------------
public class ExtendedClassA : BaseClass
{ }
//-------------------------------------------------------------
public class ExtendedClassB : BaseClass
{
protected override string VirtualPrint()
{
return "ExtendedClassB";
}
}
Запускаем следующий код:
BaseClass a = new ExtendedClassA ();
BaseClass b = new ExtendedClassB ();
Console.WriteLine (a.Print ()); //Результат: BaseClass
Console.WriteLine (b.Print ()); //Результат: ExtendedClassB
Чувствуете разницу? В классе ExtendedClassB у нас вообще нет определения для метода Print (), вызывается метод базового класса, который потом вызывает переопределенный виртуальный метод класса ExtendedClassB. Если бы метод VirtualPrint () не был виртуальный, тогда мы бы всегда получали BaseClass вызывая метод Print () из ссылки на BaseClass.
2. См выше.
3. Модификатор readonly говорит о том, что пропертя может быть установлена только в конструкторе (помоему все прозрачно). А на проперти set и get можно ставить свои модификаторы доступа. Напр:
public string X { get {return xx;} private set {xx = value;} } Не думаю, что стоит кричать о каком-то там шоке, не разобравшись в матчасти…
PomAH4uK,
А про яку технологію/мову вчити, то я б мабуть радив вчити то що мало знають, і де можна бути на верхівці ієрахії. А то з сертифікованих 1 міл...NET програмістів, трошки важкувато буде виділитись))
А какой смысл тебе быть круче 1 000 000 сертифицированных программистов? То есть, ты хочешь сказать, что тебе сейчас мешают жить 1 000 000 прямых конкурентов?;)
а сколько понял смысл, это реализованый метод который можно переопределить.
А вот сначала пойми смысл, а потом пиши по поводу шока и всего остального. В C# есть много фич, которые позволяют разным программистам быстрее перейти на C#. Собственно, для этого же и поддерживают VB.NET — для совместимости с старыми более опытными разработчиками.
От слова виртуальный у меня появилось недорозумение (может ребята знакомые с с++ больше об этом знают), нах оно надо?!
msdn.microsoft.com/...ibrary/aa645767 (VS.71).aspx
PS junior NET
C# уже некоторое время не позиционируется как чистый ООП язык, он идет по своей дорожке, очень много смешуя в себе. Прочитал в блоге одного из разработчиков: «Нам пофик, что C# отходит от принципов ООП, главное чтоб разработчику было удобно и мы будем вводить все понравившиеся нам фишки (ФП, МП и т.д.) » (не дословно так, но смысл правильный). Никто не говорит что ООП это единственно правильная парадигма, поэтому на этот счет на советую не переживать =).
Соглашусь, что C#, как и java, ОО языки.
вот тут подробнее, что тебя шокировало?
Посоветовал бы из кросплатформенных учить java, потом C#. Вот)
Моя последовательность: C++, PHP, Python, Perl, Java, Ruby.
главно не слушай фанатиков, которые любят холиварить на тему «Java vs C#», обе технологи имеют свои плюсы и минусы
вопрос типа «какой цвет лучше? красный или зеленый или... какая обувь лучше зимня или летняя, туфли или кеды? ». ОЗНАКОМЬСЯ и с обеими технологиями, НО ВЫБЕРИ ОДНУ и изучай
LINQПеречислите пожалуйста.
+ большое количество сопутствующих технологий
-
учи visual foxpro — и быстрота, и функциональность, и БД, и СЕТИ, и прикладность, и легкость, и простота написания одних и тех же приложений что и на.НЕТ только без геморра
не стоит про кроссплатформенность забывать... хотя для дотнета есть моно, но это уже новелл, а не мелкомягкие..., а ведь мог мигель в гномика жабу засунуть: (
Лично мне Java ближе по духу «open source», и «community»:)
Как показывает практика один код лучше писать на СиШарпе, второй на Java, а третий вообще на ассемблере. Малоактуальным.NET на мой взгляд станет не скоро, если не забывать какая компания его разрабатывает. Да вообщем как и J2*. Что больше нравится то и выбирайте) Исходя из этой статьи www.developers.org.ua/...p-and-embedded оба языка одинаково хорошы)
Будьте знакомы и с тем и с тем
а-ля «Вот как неплохо было бы это написать на Java, а вот это на.NET».
Быть знакомым и с тем и с другим может только специалист с некоторым опытом, а делать выводы «лучше или хуже» может только высокопрофессиональный специалист.
Java и C# — не технологии, а языки и они останутся актуальными достаточно долгое время. Технологии — это ASP.NET, LINQ, J2SE, J2ME, а это разные вещи.когда вы станете гуру в одной из обоих технологий
Если вы выучите C#, это не означает, что вы автоматически сможете писать на ASP.NET, или, например, знание языка Java автоматически не научит вас писать на J2ME.
+1 — после этого у вас появится свое первое собственное мнение а-ля «Вот как неплохо было бы это написать на Java, а вот это на.NET».Будьте знакомы и с тем и с тем
Также меня терзает смутное сомнение, что ко времени, когда вы станете гуру в одной из обоих технологий — они будут уже малоактуальными, и вы снова будете стоять перед выбором «А или Б»
Все новое — хорошо забытое старое.
Вы философ или программист?
Но Вам sashaeve, к сожалению, этого понять не дано.
Почему же не дано? Или может быть вы меня хорошо знаете, что делаете такие выводы?
Будьте знакомы и с тем и с тем, но изучайте что-то одно для того, что бы стать профессионалом.Автор как раз и спрашивает, что из «того» и «того» учить...
3. Развитая коммюнити, сайты codeplex, codeproject, всевозможные видео, документация, форумы, блоги, devdays от Microsoft, BizSpark, DreamSpark и многое другое.
Изучайте и то и то.
Будьте знакомы и с тем и с тем, но изучайте что-то одно для того, что бы стать профессионалом.
Как Вы думаете, при покупке, джава начнёт сдавать позиции или наоборот IBM их усилит?
В случае с.NET также порекомендовал бы DevExpress компоненты вместо стандартных — легче писать красивый ГУЙ (как то по русски это слово не очень на экране выглядит): -)
2sashaeve
Это ооооочень старый анекдот, по-идиотски переделанный автором блога, который вряд ли сможет поможет стать на путь истинный...
Все новое — хорошо забытое старое. Но Вам sashaeve, к сожалению, этого понять не дано.
Когда у меня встает такой выбор между двумя технологиями, я обычно иду на dice.com и смотрю на что вакансий больше)), в дополнение можно еще тренды зряплат поизучать.
2sashaeve:
Ага, нашел еще версию тут:Мне кажеться, что даже этот вариант не является первоисточником, так как главные действующие лица анекдота были явно не программисты...
www.circusnikulin.ru/...ous/jokes1.html
А если серьезно по теме, то никто не даст однозначный ответ. Дотнетчики будут говорить, что C# лучше, явисты будут говорить обратное. Это все равно, что создать тему: что лучше — Windows или Linux.
Да, информации которую дал andreas недостаточно даже для совета, потому советы может быть например такими — бросить монетку, lmgtfy.com q=.Net+vs+Java, выбрать тот язык, который учат товарищи, особенно более опытные, дождаться что будет с Java если Sun будет куплена IBM-ом или что будет с шарпом если победит Опенсорс и М$ рухнет.
Как дотнетчик скажу, что C# — достаточно интересный и развитый язык, на котором приятно писать.
Хотя в целм вопрос больше относится к чему-то типа
Папа, а шо лучче — пулімьот чи танк?
Оригинальный (или более старый) анекдот по идее формулируется приблизительно так.
Эта шутка о Java и C#.NET поможет стать тебе на путь истинный;)
Это ооооочень старый анекдот, по-идиотски переделанный автором блога, который вряд ли сможет поможет стать на путь истинный...
Ну и пока не определисись, можно поизучать то, что для является общим для этих языков (и не только этих).
127 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів