августа 17, 2009Книги по C#

WLW-MicrosoftRenamesCLanguage_7F72-csharp_thumb Недавно в мой фейсбук написал читатель блога Владимир Пивовар (vladimirpivovar) с просьбой ответить на возникшие вопросы по созданию плагина для IE на базе фреймворка SpicIE. Надеюсь, мои ответы оказались полезны Владимиру. Он так же поинтересовался, какую литературу стоит прочесть по языку C#. Думаю, что этот небольшой список, который я приведу в данном посте окажется полезным не только Владимиру. Дополнения в комментариях, как всегда, горячо приветствуются. Итак:

  • Герберт Шилдт — “Полный справочник по С#”. На мой взгляд, отправная точка, с которой стоит начать.
  • Дж.Рихтер — “CLR via C#. Программирование на платформе Microsoft .NET Framework 2.0 на языке C#”. Данная книга мне досталась зимой от Microsoft. В книге подробное описание внутреннего устройства и функционирования общеязыковой исполняющей среды (CLR) Microsoft .NET Framework версии 2.0.
  • Трей Нэш — “C# 2008: ускоренный курс для профессионалов”. Особенности C# 3й версии.
  • Daniel Solis — “Illustrated C# 2008”. Для тех, кто хорошо знаком с английским, читать стоит именно в оригинале.
  • Х.Дейтел — “C#. Наиболее полное руководство”. Книга объемом больше 1000 страниц. Кроме самого языка C# рассматривается архитектура .NET, IDE Visual Studio, технологии XML, ADO.NET, ASP.NET и очень много других полезных вещей.
  • Агуров П.В — “C#. Сборник рецептов”. Небольшая шпаргалка для начинающих по некоторым типовым задачам. Позволяет избежать беготни по форумам в поисках ответов)

На последок несколько простых советов: приведенные книги рекомендую читать именно в той последовательности, в которой они в списке. Еще отмечу, что здесь именно литература в большей мере по языку C#, чем по технологиям .NET (по желанию могу сделать аналогичную подборку, указывайте в комментах интересующую технологию). Кроме рассмотрения примеров в книгах придумывайте себе аналогичные задачи по темам и реализуйте их – намного ускоряет усвоение материала. После прочтения литературы посещайте различные форумы. Там можно неплохо закрепить полученные знания своими ответами на вопросы других людей.

августа 12, 2009Наследование

Наследование — это процесс, благодаря которому один объект может приобретать свойства другого. Благодаря наследованию поддерживается концепция иерархической классификации. В виде управляемой иерархической (нисходящей) классификации организуется большинство областей знаний. Например, яблоки Красный Делишес являются частью классификации яблоки, которая в свою очередь является частью класса фрукты, а тот — частью еще большего класса пища. Таким образом, класс пища обладает определенными качествами (съедобность, питательность и пр.), которые применимы и к подклассу фрукты. Помимо этих качеств, класс фрукты имеет специфические характеристики (сочность, сладость и пр.), которые отличают их от других пищевых продуктов. В классе яблоки определяются качества, специфичные для яблок (растут на деревьях, не тропические и пр.). Класс Красный Делишес наследует качества всех предыдущих классов и при этом определяет качества, которые являются уникальными для этого сорта яблок.

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

Шилдт, Герберт. Ш57 Полный справочник по С#. : Пер. с англ. — М. : Издательский дом "Вильяме", 2004. — 752 с. : ил. — Парал. тит. англ.

августа 12, 2009Полиморфизм

Полиморфизм (от греческого слова polymorphism, означающего "много форм") — это качество, которое позволяет одному интерфейсу получать доступ к целому классу действий. Простым примером полиморфизма может послужить руль автомобиля. Руль (интерфейс) остается рулем независимо от того, какой тип рулевого механизма используется в автомобиле. Другими словами, руль работает одинаково в любом случае: оснащен ли ваш автомобиль рулевым управлением прямого действия, рулевым управлением с усилителем или реечным управлением. Таким образом, поворот руля влево заставит
автомобиль поехать влево независимо от типа используемого в нем рулевого управления. Достоинство такого единообразного интерфейса состоит, безусловно, в том, что, если вы знаете, как обращаться с рулем, вы сможете водить автомобиль любого типа.

Тот же принцип можно применить и к программированию. Рассмотрим, например, стек (stack), т.е. область памяти, функционирующую по принципу "последним пришел — первым обслужен". Предположим, вы пишете программу, для которой нужно организовать три различных типа стека. Один стек предназначен для целочисленных значений, второй — для значений с плавающей точкой, а третий — для символов. В этом случае для реализации каждого стека используется один и тот же алгоритм, несмотря на различие в типах сохраняемых данных. В случае не объектно-ориентированного языка вам пришлось бы создать три набора "стековых" подпрограмм, имеющих различные имена. Но благодаря полиморфизму в среде С# можно создать один общий набор "стековых" подпрограмм, который обрабатывает все три типа стека. Иными словами, зная, как использовать один стек, можно использовать
все остальные.

Концепцию полиморфизма часто выражают такой фразой: "один интерфейс много методов". Это означает, что для выполнения группы подобных действий можно разработать общий интерфейс. Полиморфизм позволяет понизить степень сложности программы, предоставляя программисту возможность использовать один и тот же интерфейс для задания общего класса действий. Конкретное (нужное в том или ином случае) действие (метод) выбирается компилятором. Программисту нет необходимости делать это вручную. Его задача — правильно использовать общий интерфейс.

Шилдт, Герберт. Ш57 Полный справочник по С#. : Пер. с англ. — М. : Издательский дом "Вильяме", 2004. — 752 с. : ил. — Парал. тит. англ.

августа 12, 2009Инкапсуляция

Инкапсуляция — это механизм программирования, который связывает код (действия) и данные, которыми он манипулирует, и при этом предохраняет их от вмешательства извне и неправильного использования. В объектно-ориентированном языке код и данные можно связать таким образом, что будет создан автономный черный ящик. Внутри этого ящика находятся все необходимые данные и код. При таком связывании кода и данных создается объект. Другими словами, объект — это элемент, который поддерживает инкапсуляцию.

Код, данные или обе эти составляющие объекта могут быть закрытыми внутри него или открытыми. Закрытый код или закрытые данные известны лишь остальной части этого объекта и доступны только ей. Это означает, что к закрытому коду или данным не может получить доступ никакая другая часть программы, существующая вне этого объекта. Если код или данные являются открытыми, к ним (несмотря на то, что они определены внутри объекта) могут получить доступ другие части программы. Как правило, открытые части объекта используются для обеспечения управляемого
интерфейса с закрытыми элементами.

Основной единицей инкапсуляции в С# является класс. Класс определяет форму объекта. Он задает как данные, так и код, который будет оперировать этими данными. В С# класс используется для создания объектов. Объекты — это экземпляры класса. Таким образом, класс — это по сути набор шаблонных элементов, которые показывают, как построить объект. Код и данные, которые составляют класс, называются членами класса. Данные, определенные в классе, называются переменными экземпляра (instance variable), а код, который оперирует этими данными, — методами-членами (member method), или просто методами. "Метод" — это термин, применяемый в С# для обозначения подпрограммы. Если вы знакомы с языками С или C++, то, вероятно, догадываетесь о том, что то, что С#-программист называет методом, С/С++-программист назовет функцией. А поскольку С# — прямой потомок C++, термин "функция" также приемлемо использовать, когда речь идет о С#-методе.

Шилдт, Герберт. Ш57 Полный справочник по С#. : Пер. с англ. — М. : Издательский дом "Вильяме", 2004. — 752 с. : ил. — Парал. тит. англ.

Главное в языке С# — реализация принципов объектно-ориентированного программирования (ООП). Объектно-ориентированная методика неотделима от С#, и все С#-программы в какой-то степени имеют объектную ориентацию. Поэтому, прежде чем приступать к написанию даже простой Сопрограммы, необходимо понять основные принципы ООП.

ООП — это мощный "рычаг", позволяющий усовершенствовать процесс программирования. С момента изобретения компьютера методы программирования менялись много раз и причем коренным образом, но в основном, с целью адаптации к непрерывному повышению сложности программ. Например, программирование для первых компьютеров осуществлялось посредством набора машинных инструкций (в двоичном
коде) на передней панели компьютера. Этот метод работал до тех пор, пока длина программы не превышала нескольких сот инструкций. С ростом программ был изобретен язык ассемблер, который позволил программисту писать гораздо большие и более сложные программы, используя символическое представление машинных инструкций. По мере роста программ появились языки высокого уровня (например, FORTRAN и COBOL), которые позволили программистам справляться с возрастающей сложностью программ. Когда эти первые компьютерные языки начали приближаться к критическому состоянию, было изобретено структурное программирование.

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

Объектно-ориентированное программирование вобрало в себя лучшие идеи структурного программирования и объединило их с новыми концепциями. В результате появился более совершенный способ организации программы. Если говорить в самых общих чертах, программу можно организовать одним из двух способов: опираясь либо на код (т.е. на действия, или на то, что происходит в программе), либо на данные (т.е. на то, что подвергается определенному воздействию). При использовании исключительно методов структурного программирования программы обычно организовывались с опорой на действия. Такой подход можно представить себе в виде кода, воздействующего на данные.

Объектно-ориентированные программы работают совсем по-другому. Они организованы вокруг данных, а ключевой принцип такой организации гласит: именно данные должны управлять доступом к коду. В объектно-ориентированном языке программист определяет данные и код, который разрешен для выполнения действий над этими данными. Таким образом, тип данных точно определяет операции, которые могут быть к ним применены. Для поддержки принципов объектно-ориентированного программирования все ООП-языки, включая С#, имеют три характерных черты: инкапсуляцию, полиморфизм и наследование.

Шилдт, Герберт. Ш57 Полный справочник по С#. : Пер. с англ. — М. : Издательский дом "Вильяме", 2004. — 752 с. : ил. — Парал. тит. англ.

Тема уже не раз обсуждалась на просторах сети. Уже не помню, в каком блоге нашел данный список вопросов. В данном посте привожу их. В следующих постах будут приводить ответы.

Каждый кто пишет код

  1. Объясните разницу между нитью (Thread) и процессом (Process).
  2. Что такое сервис (Windows Service) и как его жизненный цикл отличается от «стандартного» EXE?
  3. Какой максимальный объем памяти может адресовать один процесс? Отличается ли он от максимального объема виртуальной памяти, доступной системе? Как это влияет на структуру системы?
  4. В чем различие между EXE и DLL?
  5. Что такое строгая типизация (strong-typing) в сравнении со слабой типизацией (weak-typing)? Какая предпочтительнее? Почему?
  6. Некий продукт называют «контейнером компонентов» ("Component Container"). Назовите по крайней мере 3 контейнера компонентов, поставляемых с семейством продуктов Windows Server Family.
  7. Что такое PID? Чем он полезен при выявлении неисправностей системы?
  8. Сколько процессов могут слушать один и тот же порт TCP/IP?
  9. Что такое GAC? Какую проблему он разрешает?

.NET-разработчик среднего уровня

  1. Объясните разницу между интерфейсно ориентированным (Interface-oriented), объектно-ориентированным и аспектно ориентированным (Aspect-oriented) программированием.
  2. Объясните что такое «интерфейс» и чем он отличается от класса.
  3. Что такое Reflection?
  4. В чем различие между XML Web Services с использованием ASMX и .NET Remoting с использованием SOAP?
  5. Являются ли системы типов, представленные в XmlSchema и в CLS — изоморфными?
  6. Концептуально, в чем различие между ранним и поздним связыванием (early-binding и late-binding)?
  7. Использование Assembly.Load — это статическая или динамическая ссылка?
  8. Когда уместно использование Assembly.LoadFrom, а когда Assembly.LoadFile?
  9. Что такое «Asssembly Qualified Name»? Это имя файла? В чем различие между ними?
  10. Правильно ли так писать? Assembly.Load ("foo.dll");
  11. Чем отличается «strongly-named» сборка от «НЕ strongly-named» сборки?
  12. Может ли DateTime равняться null?
  13. Что такое JIT? Что такое NGEN? Каковы преимущества и ограничения каждого из них?
  14. Как основанный на поколениях сборщик мусора в .NET CLR управляет жизненным циклом объекта? Что такое «non-deterministic finalization»?
  15. В чем различие между Finalize () и Dispose ()?
  16. Чем полезен using ()? Что такое IDisposable? Как он поддерживает deterministic finalization?
  17. Что делает эта полезная команда? tasklist /m "mscor*"
  18. В чем разница между «in-proc» и «out-of-proc»?
  19. Какая технология позволяет выполнять out-of-proc взаимодействие в .NET?
  20. Когда вы запускаете компонент из под ASP.NET, в каком процессе он работает под Windows XP? Windows 2000? Windows 2003?

Ведущий разработчик

  1. Что не так вот в следующей строке? DateTime.Parse (myString);
  2. Что такое PDB? Где они должны находится, чтобы можно было выполнять отладку?
  3. Что такое «цикломатическая сложность» (cyclomatic complexity) и почему она важна?
  4. Напишите стандартный lock () плюс «двойную проверку» для создания критической секции вокруг доступа к переменной.
  5. Что такое «FullTrust»? Имеют ли FullTrust сборки, помещенные в GAC?
  6. Какие преимущества получает ваш код, если вы декорируете его атрибутами, относящимися к особым Security permissions?
  7. Что делает эта команда? gacutil /l | find /i "Corillian"
  8. Что делает эта команда? sn -t foo.dll
  9. Какие порты брандмауэра должны быть открыты для DCOM? Каково назначение порта 135?
  10. Сопоставьте OOP и SOA. Каковы принципы каждого из них?
  11. Как работает XmlSerializer? Каких ACL permissions требует использующий его процесс?
  12. Почему catch (Exception) почти всегда — плохая мысль?
  13. В чем разница между Debug.Write и Trace.Write? Когда должен быть использован каждый из них?
  14. В чем различие между компиляцией в Debug и в Release? Есть ли значительная разница в скорости? Почему или почему нет?
  15. Как работает JIT — по сборке целиком или по методу? Как это влияет на working set?
  16. Сравните использование абстрактного базового класса и использование интерфейса?
  17. В чем различие между a.Equals (b) и a == b?
  18. В контексте сравнения, что такое идентичность объектов по сравнению с эквивалентностью объектов?
  19. Как можно выполнить глубокое копирование (deep copy) в .NET?
  20. Изложите ваше понимание IClonable.
  21. Что такое «упаковка» (boxing)?
  22. string — это тип значений (value type) или ссылочный тип?
  23. В чем значимость паттерна "PropertySpecified", используемого в XmlSerializer? Какую проблему он пытается разрешить?
  24. Почему в .NET выходные параметры (out parameters) не стоит применять? Действительно ли это так?
  25. Может ли атрибут быть установлен на один из параметров метода? Чем это полезно?

Разработчик компонентов на C#

  1. Сопоставьте использование override и new. Что такое «shadowing»?
  2. Объясните использование virtual, sealed, override и abstract.
  3. Объясните использование и значение каждого компонента строки: Foo.Bar, Version=2.0.205.0, Culture=neutral, PublicKeyToken=593777ae2d274679d .
  4. Объясните различия между public, protected, private и internal.
  5. Какое преимущество вы получаете от использования первичной сборки взаимодействия (Primary Interop Assembly, PIA)?
  6. Благодаря какому механизму NUnit узнает, какой метод протестировать?
  7. В чем различие между: catch (Exception e){throw e;} и catch (Exception e){throw;}
  8. В чем разница между typeof (foo) и myFoo.GetType ()?
  9. Объясните что происходит в первом конструкторе: public class c{ public c (string a) : this () {;}; public c () {;} } Чем полезна такая конструкция?
  10. Что такое «this»? Может ли this использоваться в статическом методе?

Разработчик на ASP.NET (UI)

  1. Объясните, как POST-запрос формы из браузера становится на серверной стороне событием — таким как Button1_OnClick.
  2. Что такое «PostBack»?
  3. Что такое «ViewState»? Как он кодируется? Является ли он шифрованным? Кто использует ViewState?
  4. Что такое <machinekey> element и для чего используются эти две технологии ASP.NET? (В оригинале: What is the <machinekey> element and what two ASP.NET technologies is it used for?)
  5. Какие три Session State providers доступны в ASP.NET 1.1? Какие преимущества и недостатки у каждого из них?
  6. Что такое «Web Gardening»? Как его использование влияет на проект?
  7. В заданном ASP.NET-приложении, сколько объектов-приложений имеется, если это одно-процессорная машина? двухпроцессорная? двухпроцессорная с включенным Web Gardening? Как это отражается на проекте?
  8. Используются ли нити (threads) ASP.NET приложения повторно для различных запросов (requests)? Получает ли каждый HttpRequest свою собственную нить? Должны ли вы в ASP.NET использовать Thread Local storage?
  9. Полезен ли атрибут [ThreadStatic] в ASP.NET? Есть ли побочный эффект? Это хорошо или плохо?
  10. Дайте пример того, как использование HttpHandler может упростить существующий проект, который обслуживает Check Images на .aspx-странице.
  11. На события какого вида может подписываться HttpModule? Какое влияние они могут оказать на реализацию? Что может быть сделано без перекомпиляции ASP.NET-приложения?
  12. Опишите способы представления «arbitrary endpoint (URL)» и направьте запросы к этой endpoint в ASP.NET.
  13. Объясните как работают cookies. Дайте пример злоупотребления Cookie.
  14. Объясните важность HttpRequest.ValidateInput ()?
  15. Какого рода данные передаются в заголовках HTTP (HTTP Headers)?
  16. Сравните HTTP-запросы вида GET и POST. Что такое «HEAD»?
  17. Назовите и опишите по крайней мере 6 статус-кодов HTTP (HTTP Status Codes) и объясните о чем они говорят клиенту, давшему запрос.
  18. Как работает «if-not-modified-since»? Как это может быть программно реализовано на ASP.NET?
  19. Объясните <@OutputCache%> и использование «VaryByParam», «VaryByHeader».
  20. Как работает «VaryByCustom»?
  21. Как можно реализовать кэширование готового HTML в ASP.NET, кэшируя отправляемые версии страниц, полученные по всем значениям q= кроме q=5 (например, http://localhost/page.aspx?q=5)?

Разработчик, использующий XML

  1. В чем назначение XML Namespaces?
  2. Когда уместно использование DOM? Когда неуместно? Есть ли ограничения по размеру?
  3. Что такое «WS-I Basic Profile» и почему он важен?
  4. Напишите простой XML-документ, использующий пространство имен (namespace) по умолчанию, а также qualified (prefixed) namespace. Добавьте элементы из обоих пространств имен.
  5. В чем основное фундаментальное различие между элементами (Elements) и атрибутами (Attributes)?
  6. В чем различие между «Well-Formed XML» и «Valid XML»?
  7. Как бы вы валидировали XML используя .NET?
  8. Почему такое использование — почти всегда неудачно. В каких случаях такое уместно? myXmlDocument.SelectNodes ("//mynode");
  9. Объясните различие между «pull-style parsers» (XmlReader) и «eventing-readers» (Sax)
  10. В чем различие между XPathDocument и XmlDocument? Опишите ситуацию когда один из них может быть использован над другим.
  11. В чем различие между XML "Fragment" и XML "Document"
  12. Что означает — «каноническая» форма XML?
  13. Почему спецификация XML InfoSet отличается от Xml DOM? Что пытается решить InfoSet?
  14. Сравните DTD и XSD. В чем они схожи, в чем различны? Что предпочтительнее и почему?
  15. Поддерживаются ли DTD в System.Xml? Как именно?
  16. Всякая ли XML Schema может быть представлена в виде графа объектов? А наоборот?


Страница 10 из 20« Первая...8910111220...Последняя »

© 2009 PodCode – IT-заметки | Powered by Wordpress