Как перейти с java на c

от admin

Изучение С# после Java

Не хочу,чтобы вопрос показался идиотским, так как для меня не совсем очевидно. Знаю Java на достаточно хорошем уровне, насколько сложным будет переход на С#?

Просто возникла необходимость. У меня есть около 2 месяцев.

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

Вопрос лишь в том, что для вас «достаточно хороший уровень»

@alex91, даже и не знаю, зачем это я отвечаю на столь бессмысленный вопрос, но да ладно, попробую написать что-то умное 🙂

Начнем с того, что вспомним «скрытую политику» Microsoft( компания, которая создала и поддерживает язык C# ). Микрософтники очень любят «слизывать» у чужих, а порой, даже это самое чужое. C# изначально разрабатывался для того, чтобы потеснить Java на рынке, плюс, это был одним из первых языков для .NET платформы. Так вот, если вы не знали, С# — неплохой конкурент Jav`e. Единственный минус шарпа по сравнению с явой — заточенность под определенную платформу( Windows ). Java же кроссплатформеный. Если же рассмотреть Java и C# изнутри, то станет ясно, что они довольно схожи. Так, например, оба языка исполняются в виртуализированной среде( на виртуальной машине ), имеют встроенный сборщик мусора и т.д. А вообще вот хорошая статья про сравнение двух этих языков.

Как перейти с java на c

Войти

Авторизуясь в LiveJournal с помощью стороннего сервиса вы принимаете условия Пользовательского соглашения LiveJournal

Плавный переход с Java на C#

В этой статье я постараюсь осветить основные вопросы и подводные камни, связанные с переходом на язык программирования C# с языка Java.

В интернете есть немало источников по этой теме, начиная от Cheat-Sheat от Microsoft, заканчивая разнообразными обзорами энтузиастов. Тем не менее, и то и другое нельзя назвать дотаточно удобным средством ознакомления с новым языком — прежде всего, в силу поверхностности рассмотрения и излишней краткости.

Моя цель — постараться дать максимально подробное и развёрнутое описание ключевых особенностей C# с точки зрения программиста Java.

Итак, начнём с терминологии. Несмотря на то, что в книге Бена Ватсона, лежащей передо мной на столе, классы в C# именуются типами, я всё же буду в рамках этой статьи называть их классами, по аналогией с Java. Дело в том, что в C# типы делятся на структуры и ссылочные типы (т.е. привычные классы из Java). Есть ещё делегаты, но об этом чуть позже. Так что, такая терминология позволит избежать возможной путаницы.

Итак, в чём основные отличия? Начнём с базовых понятий. C#, как и Java, объектно-ориентированный язык со строгой типизацией. В C#, также как в Java, есть наследование, причём множественного наследования нет. Там и там есть интерфейсы, и вот их можно реализовывать в любом количестве. И там, и там есть абстрактные классы. В абстрактных классах все методы или их часть являются абстрактными, т.е. не имеют реализации. Здесь наблюдается полное сходство, вплоть до синтаксиса (ключевое слово abstract). Так же обстоит дело и с final клссами и методами, разве что вместо ключевого слова final C# использует слово sealed.

Вместо ключевого слова import используется слово using, вместо package my_pkg;namespace my_space , причём весь наш код помещается внутри этих фигурных скобок.

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

Также, как и в Java, у класса есть конструктор по умолчанию. Если мы не задали ни одного конструктора, система сгенерирует конструктор автоматически. Всё, что он будет делать — вызывать дефолтный конструктор предка.
Если мы хотим в явном виде определить, какой конструктор предка вызвать в начале своего конструктора — как и в Java, нам потребуется это указать. Как мы помним, в Java такой вызов обязан стоять в коде первой строкой, то есть до выполнения всех других команд. В C# ситуация аналогична; более того, здесь, видимо, ради наглядности, такой вызов пишется ещё до тела конструктора, сразу после сигнатуры:

Вместо привычного слова parent в C# принято ключевое слово base.

Существенные различия начинаются во время переопределения методов родительского класса.
Во-первых, при переопределении обычного метода следует указывать модификатор override (в Java это была лишь аннотация).
Во-вторых, в Java все методы виртуальны. В C# — наоборот. Чтобы сделать метод виртуальным, используется специальное ключевое слово virtual. Для тех, кто не в курсе, что это означает. Виртуальность метода предполагает, что он не привязан к конкретному классу. То есть, вызывая переопределённый метод класса-потомка даже через ссылку типа предка, мы в итоге получим реализацию потомка, так как она хранится в его таблице виртуальных функций. Здесь играет роль тип объекта, а не переменной, которая на него ссылается. В случае невиртуального метода — только тип переменной-ссылки будет определять, какая реализация будет вызвана.
Расмотрим пример:

class Base
<
public virtual void DoSomethingVirtual()
<
Console.WriteLine("Base.DoSomet hingVirtual");
>
public void DoSomethingNonVirtual()
<
Console.WriteLine("Base.DoSometh ingNonVirtual");
>
>
class Derived : Base
<
public override void DoSomethingVirtual()
<
Console.WriteLine("Derived.DoSom ethingVirtual");
>
public new void DoSomethingNonVirtual()
<
Console.WriteLine("Derived.DoSom ethingNonVirtual");
>
>
class Program
<
static void Main(string[] args)
<
Console.WriteLine("Derived via Base reference:");

Base baseRef = new Derived();
baseRef.DoSomethingVirtual( );
baseRef.DoSomethingNonVirtual() ;

Console.WriteLine();
Console.WriteLine("Derived via Derived reference:");

Derived derivedRef = new Derived();
derivedRef.DoSomethingVirtual() ;
derivedRef.DoSomethingNonVirtua l();

Эта программа выведет следующее:

Derived via Base reference:
Derived.DoSomethingVirtual
Base.DoSomethingNonVirtual <br />
Derived via Derived reference:
Derived.DoSomethingVirtual
Derived.DoSomethingNonVirtual

Как видно из этого листинга, в случае с виртуальным методом при обоих вызовах исполнился код потомка. В случае же с невиртуальным методом всё зависело от ссылки, через которую делался вызов. Обратите внимание, что в случае переопределения невиртуального метода используется слово new, что ещё раз напоминает о том, что мы не перекрываем родительскую реализацию, а добавляем новую.
Отсюда можно сделать такой вывод: делая метод виртуальным, мы лишаем потомка подобной "полиморфности". Тем не менее, даже в этом случае мы сможем вызвать реализацию предка, обратившись к ней явно: base.DoSomethingVirtual(). Поэтому, во избежание ошибок, если только нам специально не требуется получить такое поведение, стоит делать переопределяемые методы виртуальными — это избавит от путаницы.
Следующее новое понятие C# — это свойства. Свойства проще всего представить себе как внешние интерфейсы доступа к полям. Создавая свойство, в лаконичной форме задаются привычные любому Java-программисту геттер и сеттер, причём геттер оперирует со значением поля (он может как-то обработать его перед выдачей, а может вообще выдать что-то другое, хотя это уже лишено всякого здравого смысла), а сеттер оперирует значением value (то, что присвоили извне, записывая его в поле (при этом он тоже может его обработать перед записью).
Сеттер можно сделать приватным; в таком случае, изменять свойство можно будет только внутри класса. Обычно свойствам дают имена соответствующих им полей, заменяя первую букву имени поля на заглавную.
Рассмотрим пример элементарных геттера и сеттера, которые ничего не делают, кроме своей прямой функции:

Читать:
10 в 100 степени сколько

private int _id = 0;
public int Id
<
get
<
return _id;
>
set
<
_id = value;
>
>

Такие простейшие свойства применяются в C# буквально на каждом шагу. Поэтому для них придумали специальную сокращённую форму записи:

private int _id = 0;
public int Id < get; set; >

Оцените краткость подобной записи! Код стал компактнее и изящнее в разы.
Также есть способ сделать приватный примитивный сеттер:

Таким образом, классы в C# могут иметь не только методы и поля, но ещё и свойства.
И последнее, о чём я расскажу в этой части, это структуры. Структурный тип в C# всегда передаётся по значению, а не по ссылке. В этом он схож с примитивными типами данных. От него нельзя наследоваться, он не может иметь пользовательский конструктор без параметров (но при этом такой конструктор всегда создаётся в неявном виде и заполняет все поля структуры нулями). Все поля структуры должны быть проинициализированы в конструкторе с параметрами, если мы его создаём.
Структуры даже могут иметь методы, хотя в основном они используются для хранения связанных наборов данных.
Структурам также можно добавлять и свойства для доступа к полям, как и обычным классам.

Небольшой пример использования структур:

public struct Point
<
private Int32 _x;
private Int32 _y;
public Int32 X < get; set; >
public Int32 Y < get; set; ><br />
public Point(int x, int y)
<
this._x = x;
this._y = y;
>
>

Как мне перейти с Java на C #?

Я хорошо знаю Java. Какие предостережения и ресурсы помогут мне максимально безболезненно перейти на другую сторону (C #).

9 ответов

Самый большой совет: с самого начала используйте соглашения об именах .NET. Таким образом вы будете постоянно получать напоминания о том, на каком языке вы находитесь. (Звучит глупо, но это действительно полезно.) По возможности используйте идиомы языка.

Существуют различные книги специально для людей в вашей ситуации — ищите «C # for Java» в Amazon, и вы получите много результатов. Стоит прочитать внимательно , чтобы убедиться, что вы не предполагаете, что в C # все будет работать так же, как в Java. (Например, в экземпляре C # инициализаторы переменных выполняются перед телом конструктора базового класса; в Java они происходят после. Такие тонкие вещи, как это, может занять некоторое время, и их легко пропустить, если вы просматриваете беглый просмотр.)

Если вы собираетесь использовать C # 3, я бы получил книгу, которая определенно охватывает это — все в C # 3 будет для вас новым. Беспричинный плагин: моя собственная книга (C # in Depth) охватывает C # 2 и 3, но предполагает, что вы уже знаете C # 1. (Другими словами, одного этого будет недостаточно, но вы можете захотеть его как «вторую» книгу.)

  1. Установите Visual Studio 2008 и Resharper с привязками клавиш IntelliJ IDEA. Это дает вам такие вещи, как запрос на включение пространств имен, если вы начнете их использовать.
  2. Начните новый проект и начните писать код Java, когда вы сталкиваетесь с чем-то, что не работает должным образом или не может найти класс, который вы пытаетесь использовать Google «PrintLn in c #».
  3. Напишите тесты или фрагменты кода для проверки работоспособности, например, вы можете проверить, работает ли == для строк (это так)
  4. понять, что псевдонимы типов данных С # (int — это псевдоним для System.Int32, строка для System.String)
  5. посмотрите на код других людей, я рекомендую код Google JP Boodhoos
  6. Возьмите работу на C #, там много работ, требующих поддержки как Java, так и C #.
  7. Знайте свои библиотеки, большинство библиотек Java были перенесены, и в большинстве случаев их имена выглядят как (Hibernate => NHibernate) или (Xstream => Xstream.Net). Не у каждой библиотеки есть очевидное имя, поэтому просто начните искать случайные, о которых вы слышали здесь. т.е. (Rhino.Mocks, HTMLAgilityPack, MBUnit, Rhino.Commons, Castle Project)
  8. Посещайте собрания групп пользователей и ищите DNUG (группу пользователей Dot Net), они будут вам полезны, и вы сможете получить хороший совет.

Там есть шпаргалка от Microsoft для разработчиков Java, использующих C # 🙂

Я знаю, что хороший ответ уже принят. Однако хотелось бы сделать дополнение .

Я считаю, что изучение нового языка обычно включает изучение тонких синтаксических различий . особенно когда речь идет о различиях между языками в семействе C / C ++ / Java / C #.

Вот краткая аннотация к этой книге с этого сайта:

  • Новые возможности C # 3.0, такие как лямбда-выражения, анонимные типы, автоматические свойства и т. Д.
  • Все аспекты синтаксиса C #, предопределенные типы, выражения и операторы
  • Создание классов, структур, делегатов и событий, перечислений, обобщений и ограничений, обработка исключений и итераторы
  • Тонкости упаковки, операционная перегрузка, ковариация делегатов, разрешение метода расширения, повторная реализация интерфейса, типы, допускающие значение NULL, и операционный подъем
  • LINQ, начиная с принципов последовательностей, отложенного выполнения и стандартных операторов запросов, и заканчивая полным справочником по синтаксису запросов, включая несколько генераторов, объединение, группировку и продолжения запросов.
  • Потребление, запись и размышление о настраиваемых атрибутах

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

Я довольно легко осуществил переход, используя C # на работе, но одна из самых важных вещей, которую нужно сделать, — это ознакомиться с .NET API и некоторыми мощными методами, доступными в C #.

После того, как я изучил библиотеку .net, я стал полагаться на нее гораздо больше, чем раньше, поэтому очень полезно узнать о том, что она может сделать для вас. После этого, если вы вообще работаете с кодом db, изучите LINQ, а также методы lambas, анонимные типы и делегаты также будут полезны.

Сложно ли пересесть с Java на C++ или C#?

Сложно ли пересесть с Java на C++ или C#? - 1

Добрый день. Скажите пожалуйста, на сколько сложно будет пересесть с Java на C++ или C# после окончания курса Javarush? Недавно узнал, что моя профильная специальность будет требовать именно знание языков майкрософт, но заканчивать курс заранее совсем не хочется ,так как я чувствую, что знания из него откладываются в голове куда лучше разных книг.

Похожие статьи