PDA

Просмотр полной версии : Решил перейти на С#


Bletraut
30.07.2018, 22:09
Сейчас занимаюсь разработкой пары программ и одной игры на AIR, но в моем городе AIR не имеет перспектив, поэтому начал изучать С#. Во многом похож на as3, изучается довольно легко. Изучаю по книгам Гербета Шилда, Хейлсберга и Рихтера. Первой книгой в целом доволен, остальными двумя нет. Пугает только то, что учебник Шилда 2011 года, что как мне кажется, уже старовато. Хотел спросить есть ли какие годные книги >2016 года по С#, чтобы язык было узучать максимально легко, например, как в книге Колина Мука по as3?

GBee
31.07.2018, 14:59
Во многом похож на as3
Ага, как самолет на машину - вроде оба транспорт и с элементами управления, но есть нюанс. Как показывает практика - лучший способ чему-нить научиться (по моему опыту) - взять проект. Когда попка подгорает, знания тоннами вливаются в голову с каждой решенной проблемой.

ZergMaster
31.07.2018, 16:37
А что там изучать. Какую-нибудь статейку по особенностям языка, +задача +документация. Всё.

caseyryan
31.07.2018, 19:31
Ага, как самолет на машину - вроде оба транспорт и с элементами управления, но есть нюанс. Как показывает практика - лучший способ чему-нить научиться (по моему опыту) - взять проект. Когда попка подгорает, знания тоннами вливаются в голову с каждой решенной проблемой.
Так много не изучишь. Есть куча тонкостей, о которых ты сам, скорее всего даже не узнаешь (к примеру, вряд ли ты сам будешь гуглить что такое инвариантность и ковариантность и как их юзать, что такое дженерики или как устроен LINQ и т.п., ибо в as3 всего этого нет). Самый лучший вариант - все-таки читать книжки.

Bletraut, если с английским норм, то могу посоветовать книжку Joseph Albahari, Ben Albahari C# 6.0 in a Nutshell, 6th Edition (2015). Есть уже и по 7му шарпу. Но об отличиях можно и на сайте майкрософта почитать. Там в основном разные улучшения компилятора, которые позволяют, например, out переменные объявлять прямо там, где они используются, а не заранее и тип их можно не завадать, а просто прописать var, так как компилятор сам может определить тип. Есть крутые фишки по свичам и еще много вкусностей. Но все основное можно и из этой книжки узнать.
А что там изучать. Какую-нибудь статейку по особенностям языка, +задача +документация. Всё.
Ох блин) Даже не знаю что сказать на это) Никакая статейка не способна раскрыть всех особенностей языка, а делая проект с предыдущими знаниями, ты по-любому будешь пытаться искать аналоги в том в этих самых знаниях) В том же AS3, даже не зная о собственных крутых фишках шарпа, кокторых в as3 даже близко нет

СлаваRa
31.07.2018, 20:13
для C# есть хороший инструментарий, который умеет трансформировать избыточные конструкции в современные варианты, читать книги по 6-му шарпу, когда на подходе восьмой, ну я даже не знаю.. Лично я за 5+ лет, которые я пишу на шарпе не прочитал ни одной книги по нему, и честно считаю это пустой тратой времени:)

GBee
31.07.2018, 20:57
Так много не изучишь. Есть куча тонкостей, о которых ты сам, скорее всего даже не узнаешь (к примеру, вряд ли ты сам будешь гуглить что такое инвариантность и ковариантность и как их юзать, что такое дженерики

Куча тонкостей как раз и узнается в процессе решения задач, а что толку если знаешь про дженерики, а пихнуть их некуда. Да - я вряд ли буду гуглить то, чего я не знаю. Но если случайно в каком-нить совете натолкнусь - то конечно придется. Стековерфлоу реально больше дает, чем книжка.

Но я не говорю, что книги совсем не нужны, если есть время прочитать - то на здоровье, общие представления даст - уже база будет. Но в "боевых" условиях получать знания, которые ты сразу применишь и получишь опыт по мне так оптимальнее.

caseyryan
31.07.2018, 21:14
Но я не говорю, что книги совсем не нужны, если есть время прочитать - то на здоровье, общие представления даст - уже база будет. Но в "боевых" условиях получать знания, которые ты сразу применишь и получишь опыт по мне так оптимальнее.
Естественно в боевых условиях опыт получается. Но без знания теории практический путь будет труднее. Чтение книжки не отменяет ни стековерфлоу ни практику.

Лично я за 5+ лет, которые я пишу на шарпе не прочитал ни одной книги по нему, и честно считаю это пустой тратой времени

Хз, я считаю пустой тратой времени постоянные спотыкания, гугления и написание вопросов на форумах о чем-то базовом, что можно было бы быстро узнать из книжки.

п.с. Небольшой вопрос по шарпу (хотя это касается и многих других языков), для тех, кто изучал самостоятельно, без книжек (ответ писать не нужно, ибо его можно легко нагуглить, а это не интересно :D , ответьте просто для себя)
Чем отличается замыкание от короткого замыкания?

Про себя скажу, оба этих явления я знал раньше, но то, что они называются именно так, узнал из книжек

СлаваRa
31.07.2018, 21:43
Кость, у меня за все время, что я пишу на шарпе тысячи реквестов в опенсорс и я не бегаю по форумам в поисках ответов :) Все что можно узнать на формах и из книжки - можно узнать из официальной документации, только обычно быстро и по делу, но это лично мнение

для тех кто учил c# по книжкам:
чем различается foreach цикл для Array и List?
чем различается локальная функция и short lambda
чем различается event и delegate?
чем различается if(SomeEvent != null) SomeEvent(); и SomeEvent?.Invoke()?
...

Bletraut
31.07.2018, 22:43
Хз, я считаю пустой тратой времени постоянные спотыкания, гугления и написание вопросов на форумах о чем-то базовом, что можно было бы быстро узнать из книжки.

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

Tails
01.08.2018, 02:34
Тоже читал Шилдта, даже книгу покупал. C# Клёвый, гораздо приятнее чем Java.

Когда у тебя огромный опыт и багаж знаний, не один изученный язык, конечно, чтение подобной книги будет пустым занятием, проще сразу в справочник за ответом на конкретный вопрос. Книги больше нужны для новичков/среднячков, где расскажут про элементарные вещи + немного ооп + немного фишек по самому языку. Для среднячков могут быть интересные отдельные темы, которые посвящены принципиально новым для них вещам. Указатели, например.

caseyryan
01.08.2018, 12:15
чем различается foreach цикл для Array и List?
чем различается локальная функция и short lambda
чем различается event и delegate?
чем различается if(SomeEvent != null) SomeEvent(); и SomeEvent?.Invoke()?
Вот как раз на все эти вопросы есть ответы в книжке Albahari) при чем в первой половине, или даже трети книги.
читать книги по 6-му шарпу, когда на подходе восьмой, ну я даже не знаю..
мм. А у вас на работе как только выходит новая версия языка все сразу переходят на неё? Если так, то у вас видимо, очень прогрессивная компания.
Обычно приходишь на какой-то проект, а он написан еще на бородатой версии языка, и никому нафиг не надо переходить на новую, ибо много рефакторить и неизвестно какие баги из-за этого всплывут. 6ю версию точно учить надо. У нас на работе вообще сейчас пилим проект, который еще на 4й

СлаваRa
01.08.2018, 12:27
Да, у нас во всю используются возможности последней релиз версии языка.
Часть вопросов которые я задал - это вопросы из основ, они есть везде, но вот например мне интересно, что в той книге про foreach, именно в контексте вопроса и что именно написано про последний пункт. Хотя я вопросы задал не для того, чтобы померяться :)

Bletraut
01.08.2018, 12:56
Когда я изучал js, то у меня была масса тупых вопросов и костыльных решений из-за того, что я не представлял возможностей языка. Прочитав несколько книг по js (на это ушло всего лишь пару недель, потому что я не заучиваю команды) глупые вопросы сразу отпали, а когда знаешь основы, то дальше гуглить. По своей практике заметил, что без знания возможностей языка и основных команд, изучение через гугл занимает гораздо больше времени.

caseyryan
01.08.2018, 20:47
и что именно написано про последний пункт
Кусочек текста. Вообще там дофига чего написано про оператор "элвис", но мне в лом копировать из пдф из-за дурацкой прокрутки.
Null-conditional operator (C# 6)
The ?. operator is the null-conditional or “Elvis” operator, and is new to C# 6. It
allows you to call methods and access members just like the standard dot operator,
except that if the operand on the left is null, the expression evaluates to null instead
of throwing a NullReferenceException:
System.Text.StringBuilder sb = null;
string s = sb?.ToString(); // No error; s instead evaluates to null
The last line is equivalent to:
string s = (sb == null ? null : sb.ToString());
Upon encountering a null, the Elvis operator short-circuits the remainder of the
expression. In the following example, s evaluates to null, even with a standard dot
operator between ToString() and ToUpper():
System.Text.StringBuilder sb = null;
string s = sb?.ToString().ToUpper(); // s evaluates to null without error


что в той книге про foreach, именно в контексте вопроса и что именно написано про последний пункт
Там ты не найдешь именно по контексту вопроса конкретный ответ. В книжке есть подробное описание работы этого цикла, что делает компилятор при этом, про касты, боксинг и много всего. Если я сам правильно понял твой вопрос, то разница в том, что для массива тип известен компилятору сразу, и дополнительный внутренний каст не нужен. Для дженерик листа потребуется каст.
Если я не прав, поправь.

СлаваRa
01.08.2018, 21:20
?. - оператор я специально привел в связке с эвентом, ибо вся фишка именно в связке.
про массив и лист, никакого каста не надо, но для массива цикл превратится в for, потому что срабатывает специальная оптимизация, а для листа будет создан итератор, вопрос был про это:)

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

Appleman
02.08.2018, 00:15
Почему этот оператор называется словом "Элвис"?

СлаваRa
02.08.2018, 01:23
из-за "прически" :)

caseyryan
02.08.2018, 09:34
Почему этот оператор называется словом "Элвис"?
из-за "прически" :)
Я всегда думал, что это из-за того, что ?. похоже на позы элвиса, когда он всяко кривлялся возле микрофона
https://i.ytimg.com/vi/2kQfdlm_d0Q/maxresdefault.jpg
я еще не встречал книг где это все разбирается и описывается как и почему это применяется на практике, про элвис и евент, этот кейс имеет даже класификацию для статических анализаторов. На самом деле таких вопрос очень много)
Это мой косяк, что я не обратил внимание, что там Event написано. Этот сценарий в книге есть в разделе событий.
Цитата по элвису с ивентами
In multithreaded scenarios (Chapter 14), you need to assign
the delegate to a temporary variable before testing and invok‐
ing it to avoid a thread-safety error:
var temp = PriceChanged;
if (temp != null) temp (this, e);
We can achieve the same functionality without the temp vari‐
able from C# 6 with the null-conditional operator:
PriceChanged?.Invoke (this, e);
Being both thread-safe and succinct, this is now the best gen‐
eral way to invoke events.

Вкратце, элвисом можно заменить проверку на безопасность в многопоточном сценарии
я еще не встречал книг где это все разбирается и описывается как и почему это применяется на практике, про элвис и евент, этот кейс имеет даже класификацию для статических анализаторов. На самом деле таких вопрос очень много)
Так практика на то и практика. Есть разные кукбуки или книжки по подготовке к сертификации 70-483, но, естественно, они всего покрыть не могут

Psycho Tiger
04.08.2018, 13:52
`?:` это elvis, `?.` это safe navigation operator

СлаваRa
04.08.2018, 15:57
Тем, он называется Елвис оператор, но ты молодец, потому что правильный элвис - ?: тот который устраняет тернаки :)

caseyryan
04.08.2018, 16:00
`?:` это elvis, `?.` это safe navigation operator

В C# нет такого оператора ?: отдельно (если не говорить о тернарных), наверное поэтому здесь элвисом называют ?.

СлаваRa
04.08.2018, 16:14
скажем так, это сленг, в рамках c#)

caseyryan
04.08.2018, 18:58
скажем так, это сленг, в рамках c#)
Кстати вот это ?: действительно похоже на прическу Элвиса)

undefined
07.08.2018, 21:10
чет юнити его не понимает

caseyryan
08.08.2018, 14:16
чет юнити его не понимает
Потому что у тебя там старая версия рантайма подключена, наверняка еще 3.5. Зайди в Player Settings - Scripting Runtime Version и выбери более новую