👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Если у меня нелюбовь к Visual Studio, вряд ли я буду писать на С#

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

Автор темы троль?
Что лучше, виндовз или линукс?
Что лучше, фар или тотал командер?
Что лучше, мс сиквел или оракл?
Что лучше, интел или амд?

главное чтобы программист был хороший...

Ну, а «гуглити » я вже навчився. Мабуть по украiнськи гуглиться краще

Maxim Stepanenko
LINQ в java ещё нету
Ви б спочатку погуглили, а потім вже б кидалися такими закидами. Схоже на «я ніколи не бачив негрів, значить їх не існує», просто дивує така суб’єктивність.

Не ну я имел ввиду стандартный java SDK. А стороннего чего только нету на java:)

Maxim Stepanenko
LINQ в java ещё нету

Ви б спочатку погуглили, а потім вже б кидалися такими закидами. Схоже на «я ніколи не бачив негрів, значить їх не існує», просто дивує така суб’єктивність.

Еее, щось не те ви нагуглили =), це більше схоже на спробу індуса дотнетчика перейти на яву =).

Ключові слова Hibernate, Criteria, HQL

List< Product> products = Arrays.asList (Product.getAllProducts ());

Iterable< String> productNames = from ( “p” ).in (products). select (“p.getProductName () ”);

LINQ for Java, щось мені б не хотілось писати такий код=):
class Person {
static final Person TABLE = Db.alias (Person.class);
public DbInt id = DbInt.pk ();
public DbString name;}...Person p = Person.TABLE;
Person found = db.from (p).where (p.id.eq (10)).get ();
for (Person a: db.from (p).
order (p.id.asc (), p.name.desc ()).
select ())
{System.out.println (a.name.value);}

Person one = db.from (p). where (p.id.eq (x).and (p.name.eq (name:). get ();

Maxim Stepanenko

LINQ в java ещё нету

Ви б спочатку погуглили, а потім вже б кидалися такими закидами. Схоже на «я ніколи не бачив негрів, значить їх не існує», просто дивує така суб’єктивність.


Я пробовал использовать МОНО как.НЕТ под линуксом. Что вам сказать уж лучьше Ява которой я незнаю.

Пожалуйста, пишите уж лучше на Моно под Линукс. Gtk# хоть нативно выглядит, в отличие от...


Я пробовал использовать МОНО как.НЕТ под линуксом. Что вам сказать уж лучьше Ява которой я незнаю.

Пожалуйста, пишите уж лучше на Моно под Линукс. Gtk# хоть нативно выглядит, в отличие от...

2 junior_dev

бла, бла, бла... Конкретные цыфры/факты давай!

to crypto5 с формальной точки зрения, он под окнами должен быть лучше Java потому что шарп и окна одна и та же компания,
и в ее интересах и возможностях сделать так что бы эти продукты были близки...,
но с другой стороны пример Русиновича показывает что есть люди и вне Винды которые ее не плохо знают,
хотя врядли они работают над компилятором Java. Думаю Шарп тут должен быть лучше потому что он к ней ближе и его все же больше точили под винду,

в то время как Java универсальная, а как известно общий метод не лучше кастомного...

Генерики нативные, а не темплейты как яве

Могли бы вы пояснить подробнее.

(.НЕТ под виндой яву уделывает среьезно)

А в чем именно уделывает?

Если сравнивать возможности С# и Java
С# намного богаче синтаксически, Генерики нативные, а не темплейты как яве. Возможности постоянно увеличиваются.
Java — более консервативен, но с реальной кросплатформенностью иначе никак % (.
Я пробовал использовать МОНО как.НЕТ под линуксом. Что вам сказать уж лучьше Ява которой я незнаю.
Чем постоянно ловится на приколах которые работают не так как в.НЕТ.
Так что есл икросплатформенность Ява если винда то.НЕТ. (.НЕТ под виндой яву уделывает среьезно)

Вот и весь выбор.

ребята, если вы не можете отличить java code от С# — не пишите глупости

А ты уверен что я не могу их отличить? Или хамство твоя основная цель? Из того поста мне до сих пор не понятно к чему он относился, автор к сожалению не прояснил этот вопрос.

LINQ в java ещё нету

да и синтаксис совсем разный

Есть такая библиотека quaere.codehaus.org/ Есть соответствующие средства в google-collections API.

есть Hibernate.
да, а есть ещё jdbc, jdo и прочее,

а можно коннектиться к IES через JCA, но как было сказано выше (весьма правильно): «LINQ и Hibernate все таки разные вещи»

Думаю что LINQ и Hibernate все таки разные вещи. Не путайте с LINQ2SQL. Сам LINQ гораздо шире.

Да вы наверное правы, я думал вопрос относится к Java коду.
ребята, если вы не можете отличить java code от С# — не пишите глупости
LINQ в java ещё нету

да и синтаксис совсем разный

Да вы наверное правы, я думал вопрос относится к Java коду.
ребята, если вы не можете отличить java code от С# — не пишите глупости
LINQ в java ещё нету

да и синтаксис совсем разный

Ужас — собрался толпа джуниоров и спорят, как всегда, ни о чём -, а что еще вечным джуниорам остается делать.

Лучше всего — SEO. Вы думаете автор поста действительно хочет узнать Ваше мнение?
Ошибаетесь. Такие посты (аля holly war) повышают returning visitors и увеличивают количество контента на сайте.

Если по теме — язык это всего-лишь инструмент, пробуйте и поймете что лучше для конкретной задачи.

crypto5: спасибо за тест на С... интересные резалты


это жесть!!!
IList — это интерфейс
List< string> — это класс из Generic реализующий IList<>

вы путаете круглое с кислым)

Да вы наверное правы, я думал вопрос относится к Java коду.

Интерфейс в Java — это не абстрактный класс, это всего-лишь описание методов класса без кода (и то, только public-методов)....
А по поводу темы форума — не могу понять о чем спор...
Если тему понять как «Что выбрать Java или C#», тогда все зависит от задачи которую нужно реализовать...

А если «Java VS С#» — то это полный бред, а не тема, ещеб написали «BASIC VS Assembler», балобы весело на форуме =)

Человек написал, что «List — интерфейс в c++»)) Каким боком здесь плюсы — я не знаю.

По поводу сравнения — IDE для java не понравились тем, что не работал ClearType... Такой я привередливый

List — это интерфейс, а ArrayList одна из его имлементаций.

это жесть!!!
IList — это интерфейс
List< string> — это класс из Generic реализующий IList<>

вы путаете круглое с кислым)

List — это интерфейс (абстрактный класс в С++), а ArrayList одна из его имлементаций.

Позвольте не согласиться...
Если бы List был интерфейсом, тогда нельзя было бы создавать экземпляры, но вот так
List< string> x = new List< string> ();
то мы сделать можем.

И я бы не стал сравнивать интерфейс с абстрактным классом, т.к. это несколько некорректно;)

всмысле вызовется метод класса C

конечно:) и может обломиться либо AV либо обрашением, а в.Net работает правильно

AV будет например если A — это абстрактный класс

А помоему все правильно. Вначале вызывается конструктор родительского класса, и в этот момент обьект-child еще не создан.

AV тоже не случилось, но и работает не так как надо..., а когда были AV

try this one:
class A
{
public:
A ()
{
b ();
}
virtual void b ()
{
printf (“Hello world! ”);
} };
class C: public A
{
public:
virtual void b ()
{
printf (“Hello world test!!! ”);
} };
int main (int argc, char** argv)
{
A* p = new C ();

return 0; }

У меня отлично заработал следующий код на С++:
#include< stdio.h>
class A {
public:
A () {
b ();
}
virtual void b () {
printf («Hello world! »);
} };
int main (int argc, char** argv) {
A a;
return 0; }
Выдал ожидаемое мной Hello world.
По поводу поиска по таблице виртуальных методов — то я уверен что в С++ его нету, ну, а в managed environments я действительно не знаю как все происходит...

Сейчас я работаю в Чикаго, Илинойс. Да да, это мы всех уделали на выборах президента (Обама из Илинойса).))

to crypto5

кстати сорри за офтоп:), а вы из какой части социалистических штатов америки?

я тоже в низкоуровневых делах не очень... в свое время просто разбирался, так больше дизайн порисовать люблю...,
но когда хочешь сделать хороший дизайн, то нужно значть что можно делать, а что нельзя...
и вот приятным откровением был вызов в конструкторе виртуального метода, в ++ приходилось танцевать через Init методы итд...
зачем это нужно? к примеру если система плагинов то обьект создаваясь мог себя сразу зарегистрировать к каком-то хранилище, ,

а через переопределеные методы передать свойства и параметры...

для таких сред выполнения как.Net когда вы на лету на пример по желанию пользователя можете загрузить сборку с наследниками поведение заранее предугадать нельзя.
The callvirt instruction calls a late-bound method on an object. That is, the method is chosen based on the runtime type of obj rather than the compile-time class visible in the method pointer.
насчет валидировать, если в конструкторе вызвать метод пока еще не существующего обьекта, (пока контруктор не выполнен обьект не создан)

соответсвенно не создана таблица функций и при вызове метода вы получите AV.

2 junior_dev

f — это функция в зависимости реализации таблицы виртуальных функций в каждом конкретном языке ведб вы понимаете что нужно сделать lookup по этой таблице
это может быть hash или B-tree.

А можно где нибудь про это почитать? Я раньше думал (я профан в низкоуровневых делах), что смещение виртуального адреса конкретной функции в таблице становится известно на этапе линковки/компиляции, и лукап производить не нужно...

В.Net есть валидация указателя для виртуальных функций, поэтому код
class A
{
A ()
{
B (); }
virtual B ()

{} }

Можно подробнее где там Access Violation, и что тут нужно валидировать? В джава такого помоему точно нету...

f — это функция в зависимости реализации таблицы виртуальных функций в каждом конкретном языке ведб вы понимаете что нужно сделать lookup по этой таблице
это может быть hash или B-tree.
В.Net есть валидация указателя для виртуальных функций, поэтому код
class A
{
A ()
{
B ();
}
virtual B ()
{
} }
мало того что создастся без ошибок доступа к памяти, так и вызовет правильную функцию B.

В C++ как вы понимаете это код вам скажет Access violation...

2 PomAH4uK

Джавісти зможете показати як ви посортуєте список якихось обєктів по 3 полям? =)

Collections.sort (listOfObjects, new Comparator () {
int compare (Object o1, Object o2) {
Задаем правило сортировки для скольки хошь полей
} });

Как то так, а что? Если вы про Linq то в джава мире их есть.

2 sashaeve,

Если мы объявили List< string> — для чего нам ArrayList?

List — это интерфейс (абстрактный класс в С++), а ArrayList одна из его имлементаций.

2 junior_dev

время обращения к методу класса О (1) для виртуальной O (f (длина таблицы виртуальных фнкций) + g (1) — валидация указателя) что куда сложнее — падает производительность...

А откуда взялась f? И что такое «валидация указателя»?


А так можно сделать на C#?

List< String> stringList = new ArrayList< String> (); stringList.add ( “String” ); List< Integer> integerList = new ArrayList< Integer> (); integerList.add (1);

Можно будет сделать в C# 4.0 — Ко- и контра-вариантность — msug.vn.ua/...w-features.aspx

ИМХО, для кого-то панацея, для кого-то фича, не более. Если мы объявили List< string> — для чего нам ArrayList?

DateTime.Now нельзя использовать для измерения перфоманса выполнения кода.

Высокоточные замеры времени в С# средствами.NET — msug.vn.ua/.../11/22/net.aspx

Джавісти зможете показати як ви посортуєте список якихось обєктів по 3 полям? =)

лучше пользоваться Performance counter’ами:) мне так кажеться

to junior_dev
Вопрос:, а как замерять в милисекундах?

Если просто смотреть на DateTime.Now, то получается C# — ~40 секунд, Java — ~20 секунд. Тоже не правдоподобный результат.

Ticks это не милисекунды, это тики процесора, как вы понимаете при текущих рабочих частотах на одну милисекунду приходиться на порядки больше тиков...

to guani:

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: 3593

C# (.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# неверен впринципе, поэтому просьба поправить если есть какие-то ошибки.

to Евгений Луцишин

ну например NetBeans... не только редактор текста...

to a

Надо быть честным до конца, редактор кода в IDEA не зря считается одним из лутших на текущий момент (Resharper, те же возможности, только на VS для многих просто мана небесная), но IDE это не только редактор текста, но и многое другое...


Хотя уверенности нет, но думаю на Java платформе нет IDE с такими же возможностями. Если я не прав, поправте...

Подозреваю, что пользователи IDEA до сих пор не ответили потому, что не могут вылезти из под стола от хохота...

в тему скорости вызыва функций — примеров можно придумать много — менеджеры памяти/ресурсов
парсеры — уже было
мат/операции — для распознования образов, апроксимации итд... размерности и вызовы часто бывают критичны...
вирусы:)... тут нужно хорошо маскироваться под поведение системы
АИ построеный на рекурсивных алоритмах

итд...

в качестве бесплатной VS есть VS express

на практике для виртуального метода оптимизацию сделать нельзя, особенно в языках типа C#/Java так как вы в любой момент можете загрузить сборку с наследниками и пересоздать все обьекты...,
а вот для методов класса можно проводить оптимизацию, так как компилятор в этом может быть уверен:)
с практической точки зрения...:) раздобудьте парсер XML или может HTML и переведите все методы в виртуал, увидете сразу результат
кстати в нейросетях и прочих мат.апаратах которые гоняються на большой размерности такие ляпы тоже могут обернуться не хорошим делом...

да и в одной известной Гейм-дев конторе при работе с графикой каждый виртуальный метод нужно обосновывать:)

Помоему дело вкуса... Лично мне очень приятно, что «Кое-какая фирма» обо мне позаботилась и предоставила мне крутой инструмент для разработки — Visual Studio, используя который можно решить любую задачу. Хоть этот инструмент и не бесплатный... Но насчет платности пусть парится руководство.
Хотя уверенности нет, но думаю на Java платформе нет IDE с такими же возможностями. Если я не прав, поправте...

А язык — это своего рода тоже инструмент, который позволяет решать задачи. Плюсов и минусов везде хватает (я не думаю, что Java исключение:))

насчет прохождения по веткам switch, так это специально было сделано, чтобы избежать бОльших проблем. ИМХО этот функционал в С++ приносит больше недорозумений и непонятных багов чем пользы.

Возможно, но в таком случае этот явно указываемый break оказывался лишним (если проваливание в принципе невозможно). Меня смущало именно это, а не отсутствие проваливания как такового.

я далек от того чтобы говорить что C# или Java отстой...
мне действительно интересно быстрее ли и если да, то насколько, использование невиртуального метода... причем интересно с практической точки зрения...

2 junior_dev: т.е. в Java ваш пример с парсером будет работать одинаково, хотелось бы увидеть в C#... теоретически я согласен, что вызов невиртуального метода должен быть быстрее, но если на практике из-за оптимизаций компилятора, влияния притяжения луны или других факторов разницы не будет — то в чем тогда их полезность?

просто нужно наверное начинать с того какой круг задач решает человек, а уж потом обсуждать о преимуществах языка...
например для JSP или ASP нет никакой разницы instance or virtual method call и там и там скорость прорпдет в других местах, ,

а вот когда будете писать програму управления крытой ракеты:) то задумаетесь...

отстой это метод который используеться не по назначению..., а все остальное дело вкуса

Разговор заходит в тупик. Не хватает какого-нибудь маньяка, который бы сейчас заявил что C# and Java отстой..., а вот JavaSrcipt!!!:)

вы уверены что отстутсвие разницы не кроеться:
1 — оптимизации компилятора
2 — медленой работы метода A, а не быстрой работы метода B
если не полениться и взять язык типа C++ и дизамеблировать, то можно увидеть стоимость вызова статического метода, а именно просто переход по адресу (что и логично,
так как адрес известен на этапе компиляции) и вызов обьекта через поиск в таблице виртуальных функций фактического адресса, который вычисляеться динамически.
В добавление для вызова известного метода (изветен тип-адрес) компилятор может оптимизировать, для динамического — никак.
Насчет ваших результатот эксперимента на Java мне сложно что-то сказать, так как я кода JVM не видел, и давно байт-код не разбирал.
В дот-нете помню давно это было для простых методов завется call, а для виртуальных call с вычмслением и валидацией адресса, что понятно стоит дороже...
если вернемся к теме парсера, то не сложно представить долю времени на вызовы функций...

и более того вам профайлер это время не покажет, так как в большинстве он засекает время в скопе...

class Methods {
public static void A () {
}
public void B () {
} }
public class Test {
public static void main (String [] args) {
Methods.A ();
long start = System.currentTimeMillis ();
for (int i = 0; i < Integer.MAX_VALUE; i++) {
Methods.A ();
}
System.out.println (System.currentTimeMillis () — start);
Methods t = new Methods ();
long start2 = System.currentTimeMillis ();
for (int i = 0; i < Integer.MAX_VALUE; i++) {
t.B ();
}
System.out.println (System.currentTimeMillis () — start2);
} }
каждый из циклов выполняется около 2.5 сек...
разница в десятки миллисекунд, что очень сравнимо с погрешностью теста... т.е. можно сделать вывод что разницы нету...

проведите такой тест на C# с виртуальным и невиртуальным методом, интересно

to Вадим Міхневич:

насчет прохождения по веткам switch, так это специально было сделано, чтобы избежать бОльших проблем. ИМХО этот функционал в С++ приносит больше недорозумений и непонятных багов чем пользы.

to Хехе: ну ты жгешь... А что в этом коде такого? Если ты говоришь о сохранении ссылки ArrayList в List< T>, то конкретно такого сделать нельзя, т.к. нет generic версии ArrayList... Но позволь спросить зачем это если есть List?
Начинается обсуждение, а что можно, а что нельзя, что хорошо и что плохо:) и у меня тогда ответный вопрос... А в java можно сделать вот так:
List< string> list = new List< string> (3);
list.Add ( «1» );
list.Add ( «2» );
list.Add ( «3» );
string s = (from x in list where x == «1» select x).Single ();

Console.WriteLine (s);// Не поверите, но результат будет 1

Зовні виглядає, що у даному випадку різниця лише у типових значеннях (якщо не залазити в таблиці віртуальності, оптимізацію і тому подібні глибини компіляторів) — для Java методи типово віртуальні, а для С++/C# — не віртуальні, але і там і там це можна обходити певними синтаксичними конструкціями. І лише справа вподобань, кому що звичніше і зручніше. І це, мабуть, стосується і багатьох інших аспектів обох мов. Свого часу мені в С# не сподобалась необхідність break у кожній гілці switch і відсутність при цьому провалювання. Дрібниця, звісно, але з дрібниць складається імідж.

хорошо, например при разборе лексем зачастую вы ходите по функциям которые их обрабытывают,
средняя длина слова 4−5 символов то есть количество вызовов функций 1/5 * размер документа,
время обращения к методу класса О (1) для виртуальной O (f (длина таблицы виртуальных фнкций) + g (1) — валидация указателя) что куда сложнее — падает производительность...

теперь представим 2 браузера на рынке, один открывает большие документы 5 сек, второй 25, какой вам понравиться больше?

2 junior_dev: ну вы привели в пример парсер... попробуйте на этом примере...

А так можно сделать на C#?

List<String> stringList = new ArrayList<String>();
        stringList.add("String");

List<Integer> integerList = new ArrayList<Integer>();
        integerList.add(1);

никто не спорит что танк обладает сильным орудием и броней, но ведь не только он один на воружении у армии стоит?

всему свои методы:), а умение выбрать, обосновать и воплотить лучший отличает специалиста от обывателя

to guani
если вы опишите те задачи которые перед вами стоят, я могу попробывать описать возможную полезность

в большинстве задач с которыми я сталкивался в Украине это никому не надо...

статический метод отличаеться от метода обьекта:)

финализация не решает проблему производительности вызова

В обоих языках похожая структура, но используются разные подходы. Говорить что С# отстой — это говорить что 80 или 90% Java тоже отстой:) ИМХО.
Насчет запрета переопределения, есть такая же конструкция и в.NET
public new int B ()

{}

2 junior_dev:, а использование static методов считается хаком?
А для того чтобы кто-то «случайно» ничего не переопределил, можно финализировать методы например.

Меня пока не убедили в полезности невиртуальных методов:)

Чтобы зарретить переопределять метод, достаточно использовать final.


public final int B()
{

}

в Java есть другие методы оптимизации вызовов, но они скорее на уровне хаков чем на декларативном уровне...

во всяком случае создалось такое впечатление, хоть и не берусь утверждать:)

Так же это полезно в случае если вы пишете свой компонент и реализуете подобную схему:

class A
{
  public int B()
  {
    return 2;
  }

public void C()
  {
    if (2 != B())
      throw new ApplicationException("uuuuuuuu");
  }
}

теперь если вы свой контрол поставили клиенту, а он решил его расширить и случайно переопределил метод B ()  — в Java это не вопрос и вызвал C ():) то ваш код может рухнуть…
понятно что это простой кейс, но иногда он может обернуться более сложными исследованиями…

при возможной декларизации интерфейса вы можете по сути декларировать и ожидать определеные инварианты как для себя так и для пользователя…

вызов статического метода выполняеться быстрее, поэтому применяя виртуализацию только по делу, а не везде (привет Java)
можно добиться более высокой производительности, так как вызовы виртуальных функций идут не по адрессу как в случае со инстанцироваными, ,
а через таблицу с вычислением и валидацией адресса метода: если вы пишете формочки и сайт это конечно не сильно нужно, ,

но если парсер, то будет повод задуматься.

2smp: у наведеному прикладі, якщо не помиляюсь, несуттєво, огошошувати Print () віртуальним чи ні, оскільки він не наслідуєтсья.

to > Вадим Міхневич

думаю нужно 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

>> rassamaha
1) В курсі що таке віртуальна таблиця? От якщо зробити всі методи віртуальними, то швидкодія трохи має впасти, бо звернення спочатку робиться до цієї таблиці.
2) Наприклад для візуальності. Не всіх пре догадуватись чи лазити по коду, щоб дізнатись це переоприділений метод чи новий.
3) Readonly — використовуэться коли значення можна змінити тільки в конструкторі, або коли тобі треба образно константу на ссилочний обєкт.
Мда С# починає здаватись трошки дивним у 3.0 версії, мене самого шокували ці фітчі з var, лінком ітд, але потім без цього жити не можна=)
А про яку технологію/мову вчити, то я б мабуть радив вчити то що мало знають, і де можна бути на верхівці ієрахії. А то з сертифікованих 1 міл...NET програмістів, трошки важкувато буде виділитись))

PS junior NET

C# уже некоторое время не позиционируется как чистый ООП язык, он идет по своей дорожке, очень много смешуя в себе. Прочитал в блоге одного из разработчиков: «Нам пофик, что C# отходит от принципов ООП, главное чтоб разработчику было удобно и мы будем вводить все понравившиеся нам фишки (ФП, МП и т.д.) » (не дословно так, но смысл правильный). Никто не говорит что ООП это единственно правильная парадигма, поэтому на этот счет на советую не переживать =).

1. наличие виртуальных и абстрактных методов. Абстрактный метод вопросов нет, мы такое на курсе ООП проходили. От слова виртуальный у меня появилось недорозумение (может ребята знакомые с с++ больше об этом знают), нах оно надо?! На сколько понял смысл, это реализованый метод который можно переопределить. Зачем вообще такой, если в джава для этого вообще ничего писать не надо.
2. тут же появлются модификаторы которые определяют, что данный метод переопределен. Зачем дополнительный модификатор?
3. инкапсуляция. Впринципе довольно прикольно сделали, типа есть поле и обращаясь к нему на самом деле вызываются getXX и setXX. Зачем тогда модификатор readonly? если можно просто setХХ не реализовывать.
Вообщем общее впечатление — много ненужного.
По поводу классическое. Как нас учили в ДПИ, такое для меня классическое. Где нет множественного наследования, как в С++ и т.п.

Соглашусь, что C#, как и java, ОО языки.

С# — для меня их ООП стало шоком

+1

Что ж там такого шокирующего?

Ага. И заодно просветить с каких это пор ООП в жаве стало «классическим».

С# — для меня их ООП стало шоком. Виртуальные и абстрактные методы это что-то). На мой взгляд их ООП хуже чем у java.

вот тут подробнее, что тебя шокировало?

C# — vendor coded, никак не посмотришь.

Исходники.NET Framework открыты.

2 года писал на java, счас начал учить C#.
Соглашусь что под каждую задачу нужно выбирать свой язык.
Исходники:
исходники java открыты, ты можешь посмотреть код как работает та или иная функция.
C# — vendor coded, никак не посмотришь.
Апликейшен серверы:
java — бесплатные (Tomcat, JBoss...) и платные (Oracle, WebLogic...) .net — походу только IIS
GUI
java — тут сложнее чем в.net, хотя можно кастомизировать вид твоих контролов как хошь..net — мало знаю, но видел что довольно просто.
ООП
java — для меня там все предельно понятно, классическое ООП
С# — для меня их ООП стало шоком. Виртуальные и абстрактные методы это что-то). На мой взгляд их ООП хуже чем у java.
В целом С# по синтаксису и идеологии сродни java (у меня такое впечатление что мелкомягкие делали C# таким образом: зачем нам java? Давайте напишем свой язык, с блекджеком и шлюхами).
Не стоит забывать, что java можно применять практически на всех платформах, а c# на меньшем.
а! еще идеогии:
java — написано раз, работает всегда..net — из любомого приложения, доступ к любому ресурсу (что-то такое).
и еще много чего можно написать.

Посоветовал бы из кросплатформенных учить java, потом C#. Вот)

Согласен с тем, что язык программирование — это лишь инструмент, нужный для решения задачи.
Иногда приходится молотком откручивать гайку, потому что нет нужного ключа, а молоток как раз удобно заходит в паз.
2 andreas: Если ты только начинаешь учиться, возьми Питон или Руби, они простые для понимания принципов, потом сделай тестовый проект на Питоне, потом на Яве, сделай выводы, потом можешь переходить на.Нет (если захочешь) и дальше.

Моя последовательность: C++, PHP, Python, Perl, Java, Ruby.

После покупки Сана будущее инновационной составляющей Явы под вопросом

главно не слушай фанатиков, которые любят холиварить на тему «Java vs C#», обе технологи имеют свои плюсы и минусы

вопрос типа «какой цвет лучше? красный или зеленый или... какая обувь лучше зимня или летняя, туфли или кеды? ». ОЗНАКОМЬСЯ и с обеими технологиями, НО ВЫБЕРИ ОДНУ и изучай

Перечислите пожалуйста.

LINQ
lambda-выражения
var — переменные
extension — методы
в 4.0 — тип dynamic, упрощенная работа с COM
декларативное программирование (атрибуты, автогенерация кода)
быстрое определение свойств (public string prop {get; set;})

+ большое количество сопутствующих технологий

В C# возможностей и фич языка больше.

Перечислите пожалуйста.

В C# возможностей и фич языка больше.

А ещё у Джавы красивый и вкусный логотип:)

учи visual foxpro — и быстрота, и функциональность, и БД, и СЕТИ, и прикладность, и легкость, и простота написания одних и тех же приложений что и на.НЕТ только без геморра

не стоит про кроссплатформенность забывать... хотя для дотнета есть моно, но это уже новелл, а не мелкомягкие..., а ведь мог мигель в гномика жабу засунуть: (

Кажется вакансий на Java меньше, но платят в среднем больше:)

Лично мне 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, к сожалению, этого понять не дано.

Почему же не дано? Или может быть вы меня хорошо знаете, что делаете такие выводы?

Будьте знакомы и с тем и с тем, но изучайте что-то одно для того, что бы стать профессионалом.
Автор как раз и спрашивает, что из «того» и «того» учить...
Дополню Евгения:
1. Visual Studio является мощным инструментом для разработки (все в одном) + большое количество add-in = удобная стандартизированная разработка
2. Даже базовые знания.NET позволят вам писать программы под MS Office, под мобильные устройства, разрабатывать сайты, настольные приложения и интегрировать ваши приложения в большое количество других приложений.

3. Развитая коммюнити, сайты codeplex, codeproject, всевозможные видео, документация, форумы, блоги, devdays от Microsoft, BizSpark, DreamSpark и многое другое.

Изучайте и то и то.

Будьте знакомы и с тем и с тем, но изучайте что-то одно для того, что бы стать профессионалом.

IBM ведет переговоры о покупке Sun Microsystems

Как Вы думаете, при покупке, джава начнёт сдавать позиции или наоборот IBM их усилит?

Изучайте и то и то.

Два языка дают примерно равные возможности.
Рекомендую.NET по двум причинам:
— Человек на.NET быстрее обучается и требует меньше опыта для написания простого прикладного кода. В результате.NET юниором будет проще устроиться чем юниором на Java.
—.NET более стандартизированная среда, почти все устанавливается вместе с Visual Studio. А в Java большой шанс выбрать не те фреймворки, не ту среду итд. Даже просто настроить среду будет сложнее.
Кроме того не забудь, что выучить надо далеко не только синтакс языка, но и умение создавать и доступаться к базе данных, писать десктопный и вебный GUI.

В случае с.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-ом или что будет с шарпом если победит Опенсорс и М$ рухнет.

2 Сергей
Мне кажеться, что даже этот вариант не является первоисточником, так как главные действующие лица анекдота были явно не программисты...
А если серьезно по теме, то никто не даст однозначный ответ. Дотнетчики будут говорить, что C# лучше, явисты будут говорить обратное. Это все равно, что создать тему: что лучше — Windows или Linux.

Как дотнетчик скажу, что C# — достаточно интересный и развитый язык, на котором приятно писать.

2andreas:
Можете еще посмотреть интересную статистику от O’Reilly
radar.oreilly.com/...ook-mar-22.html

Хотя в целм вопрос больше относится к чему-то типа

Папа, а шо лучче — пулімьот чи танк?

Оригинальный (или более старый) анекдот по идее формулируется приблизительно так.

Эта шутка о Java и C#.NET поможет стать тебе на путь истинный;)

Это ооооочень старый анекдот, по-идиотски переделанный автором блога, который вряд ли сможет поможет стать на путь истинный...

Эта шутка о Java и C#.NET поможет стать тебе на путь истинный;)

А пока никто не ответил, можете посмотреть статистику зарплат по этим и другим технологиям

Ну и пока не определисись, можно поизучать то, что для является общим для этих языков (и не только этих).

Підписатись на коментарі