Учимся C#. Ведро второе.

    Результаты отзывов


    Немного о C# и *nix


    Многих заинтересовало, как же можно писать на C# в *nix системах. Попробую помочь нашим друзьям. Существует проект Mono и вот, что нам говорит Википедиа:
    Mono — проект по созданию полноценного воплощения системы .NET на базе свободного программного обеспечения.
    Mono включает компилятор языка C# — mcs, среду исполнения .NET — mono (с поддержкой JIT) и mint (без поддержки JIT), отладчик, а также ряд библиотек, включая реализацию ADO.NET и ASP.NET. В рамках проекта также разрабатываются привязки для графической системы GTK+ на платформу .NET.
    Среда исполнения mono может исполнять модули, написанные на языках C#, Visual Basic .NET, Java, Boo, Nemerle, Python, JavaScript, PHP и Object Pascal (при наличии компилятора в среду .Net/Mono). Ожидается также поддержка языков C, Ada 2005 и Eiffel.
    Реализации Mono существуют для следующих операционных систем: GNU/Linux, Solaris, Mac OS X, Microsoft Windows и Unix.

    И это говорит нам о том, что мы спокойно можем программировать практически в любой ОС на C#. Последний релиз Mono Project — 2.2. Mono Project — здесь вы сможете загрузить самую последнюю версию, а так же посмотреть документацию.
    Так же есть ещё одна хорошая новость. У группы разработчиков Mono есть дочерний проект — MonoDevelop. Это бесплатная IDE для C# и ASP.NET. Она поддерживает все необходимые функции для успешной и быстрой разработки в *nix системах.



    Сосед мой — Друг мой


    Так как по соседству пишутся статья о таких языках программирования, как Ruby и Python, то надо бы с соседями задружить.
    IronRuby
    IronRuby — реализация языка программирования Руби на платформе Microsoft .NET. Интерпретатор реализован на основе Dynamic Language Runtime, библиотеки, работающей на CLR 2.0, которая предоставляет, среди прочего, динамическую типизацию и динамическое определение методов.

    IronPython
    IronPython —— одна из основных реализаций языка Python, предназначенная для платформы Microsoft .NET или Mono. Полностью написан на C#, и является транслятором компилирующего типа.
    В IronPython можно использовать типы .NET. Также можно из .NET код использовать IronPython код, либо посредством хостинга IronPython системы, либо предварительной сборки IronPython кода.

    IronPython

    А почитать?


    Из книг для меня родной стала C# для профессионалов. Авторы: Симон Робинсон, Олди Корнес, Джей Глин, Бартон Харвей и др. Я начинал прямо с неё, но так, как у меня был опыт программирования и если у вас его нет, то рекомендую почитать C# Автор: Карли Ватсон.
    C# Автор: Карли Ватсон.
    C# для профессионалов. Авторы: Симон Робинсон и др.

    А теперь продолжим…

    Типы данных C#


    Wikipedia
    Тип данных (встречается также термин вид данных) — фундаментальное понятие теории программирования. Тип данных определяет 1) множество значений, 2) набор операций, которые можно применять к таким значениям и, возможно, 3) способ реализации хранения значений и выполнения операций. Любые данные, которыми оперируют программы, относятся к определённым типам.


    С# является жестко типизированным языком. При его использовании вы должны объявлять тип каждого объекта, который создаете (например, целые числа, числа с плавающей точкой, строки, окна, кнопки, и т. д.), и компилятор поможет вам избежать ошибок, связанных с присвоением переменным значений только того типа, который им соответствует. Тип объекта указывает компилятору размер объекта (например, объект типа int занимает в памяти 4 байта) и его свойства (например, форма может быть видима и невидима, и т.д.).

    Чтобы лучше понять, для чего они, то приведу пример. Тип это тот же сорт. Например сорт яблоков. Яблоко одного сорта может быть большой, содержать n железа и быть красным, а другого сорта быть маленьким и быть фиолетывым =)

    С# также подразделяет типы на две другие категории: размерные и ссылочные.

    Встроенные типы



    Язык С# предоставляет программисту широкий спектр встроенных типов. Все они соответствуют CLS (Common Language Specification) и это гарантирует, что объекты, созданные на С#, могут успешно использоваться наряду с объектами, созданными на любом другом языке программирования, поддерживающем .NET. Каждый тип имеет строго заданный для него размер, который не может изменяться.
    Давайте посмотри на таблицу встроенных типов:



    В первом столбце идёт название типа, затем область значений (от скольки до скольки) и наконец размер.

    Преобразование встроенных типов


    Объекты одного типа могут быть преобразованы в объекты другого типа неявно или явно. Неявные преобразования происходят автоматически, компилятор делает это вместо вас. Явные преобразования осуществляются, когда вы «приводите» значение к другому типу. Неявные преобразования гарантируют также, что данные не будут потеряны. Например, вы можете неявно приводить от short (2 байта) к int (4 байта).
    Опять таки небольшой пример. Пусть у нас есть ведро и чашка. =) Если мы воду из чашки перельем в ведро, то получится «неявное преобразование», а если из ведра в чашку, то только «явно». А как это возможно? Просто у нас вся остальная вода выльется.
    Независимо от того, какой значение находится в short, оно не потеряется при преобразовании к int:
    1. short x = 1;
    2. int у = х; //неявное преобразование

    Если вы делаете обратное преобразование, то, конечно же, можете потерять информацию. Если значение в int больше, чем 32.767, оно будет усечено при преобразовании. Компилятор не станет выполнять неявное преобразование от int к short:
    1. short х;
    2. int у = 5;
    3. х = у; //не скомпилируете

    Вы должны выполнить явное преобразование, используя оператор приведения:
    1. short х;
    2. int у - 5;
    3. х = (short)у; //А вот теперь всё ОК


    Типы по ссылке


    Тип Object


    В C# тип object является исходным типом-предком для всех типов. Ссылку object можно использовать для привязки к любому объекту. Так же полезна в отражении, когда код должен работать с объектами тип которых не известен.
    Object предоставляет нам несколько замечательных методов. Equals(), GetHashCode(), GetType() и ToString(). Эти методы доступны любому объекту и о них мы поговорим позднее.

    Тип String


    У C# имеется свой тип string. Поэтому такие операции как копирование и слияние происходит моментально.
    1. string s1 = "Здравствуй, ";
    2. string s2 = "Хабра";
    3. string s3 = "хабр!";
    4. string s4 = s2 + s1 + s3;
    5. Console.WriteLine(s4); // => Здравствуй, Хабрахабр!

    Несмотря на то, что присвоение происходит в стиле типов по значению, тип System.String является типом по ссылке. К строкам мы ещё вернёмся!

    Переменные


    Переменная — это расположение в памяти объекта определенного типа. В приведенных выше примерах х и у — переменные. Переменные могут иметь значения, которыми они проинициализированы, или эти значения могут быть изменены программно.
    Чтобы создать переменную, вы должны задать тип переменной и затем дать этому типу имя. Вы можете проинициализировать переменную во время ее объявления или присвоить ей новое значение во время выполнения программы. Вот пример программы, который в первом случае использует инициализацию для присвоения значения переменной, во втором случае использует присвоение значения переменной с помощью оператора «=»:
    1. class Variables
    2.   {
    3.     static void Main()
    4.     {
    5.       int myInt = 10;
    6.       System.Console.WriteLine("Инициализированная переменная myInt: " + myInt);
    7.       myInt = 5;
    8.       System.Console.WriteLine("Переменная myInt после присвоения значения: " + myInt);
    9.       Console.ReadLine();
    10.     }
    11.  
    12.   }

    Результат работы этой программы будет следующий:
    Инициализированная переменная mylnt: 10
    myInt после присвоения значения: 5
    Здесь строка:
    int myInt = 10;
    означает объявление и инициализацию переменной mylnt. Строка:
    myInt= 5;
    означает присвоение переменной mylnt значения 5.
    С# требует определения значений, то есть переменные перед использованием должны быть инициализированы. Чтобы проверить это правило, рассмотрим следующий пример:
    1. class Variables
    2.   {
    3.     static void Main()
    4.     {
    5.       int myInt;
    6.       System.Console.WriteLine("Неинициализированная переменная myInt: " + myInt);
    7.       myInt = 5;
    8.       System.Console.WriteLine("После присвоения переменной myInt: " + myInt);
    9.  
    10.     }
    11.   }

    Если вы попробуете скомпилировать этот пример, компилятор отобразит следующее сообщение об ошибке:
    error CS3165: Use of unassigned local variable 'mylnt'
    Нельзя использовать неинициализированную переменную в С#!

    А может попробуем?


    Итак давайте напишем небольшую программу. Что она будет делать? Выводить краткое досье на человека:
    1. using System;
    2.  
    3. class First
    4. {
    5.   string country, city;
    6.   string name = "Вася Пупкин";
    7.   int old, num;
    8.   
    9.   old = 12;
    10.   num = 666;
    11.   country = "Russia";
    12.   city = "Наша";
    13.   
    14.   Console.WriteLine("Имя: " + name);
    15.   Console.WriteLine("Возраст: " + old);
    16.   Console.WriteLine("Локация проживания: " + country + city);
    17.   Console.WriteLine("/n/tСерийный номер: " + num);
    18.    Console.ReadLine();
    19. }


    Сначало идёт объявление переменых и инициализация. Следом вывод этих переменых. На строке 17 вы встретили два новых символа для вас. Это /n и /t. Первый служит для перевода коретки на новую строку, а второй — знак табуляции. Ниже есть таблица символов, которые вы можете использовать.


    На 18 строке мы добавили Console.ReadLine() — это сделано для того, чтобы после запуска программы консоль не закрывалась.

    На сегодня всё.

    P.S. Только что нашёл для кого-то возможно интересную ссылку.
    C# для вундеркиндов. (MSDN)
    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 58

      +3
      Я вот одно не понял. Почему после комментариев Спасибо и Продолжайте я начал делать вторую часть, а тут такой негатив? Мне показалось комментов ЗА было больше, чем ПРОТИВ. Я не прав?
        0
        совсем уж примитивные вещи пишите, да еще и несколько раз повторяя одно и то же.

        я хоть c# и не люблю, использовать никогда не собираюсь, но тем не менее уметь на нем программировать считаю не лишним.
        несколько языков я знаю, так что мне хотелось бы узнать об особенностях c#, а не о том как программировать вообще.
        то, что вы написали больше похоже на псевдокод с программой «hello world», чем на пример c#.

        а еще, разве в последнем.нете необходимо обьявлять тип переменной если он очевиден?
          0
          Не обязательно, var x = «string» вполне подойдёт, но нагляднее по-моему, писать string x = «string»;
            +2
            Спасибо! Я учту.
            Возможно это по причине того, что я привык разжёвывать всё студентам.
              +1
              Для меня интереснее было бы узнать побольше о Win приложениях, с консолью вроде все понятно, а вот статейка о win-приложениях не помешала бы
              Спасиб за старания, не всем и азы знакомы, буду следить за темой
              0
              Стоит наверное делать более узкие статьи, например отдельно про Mono и его особенности, или про IronPython, или написать про возможности LINQ, а может вообще рассказать про функциональный сахар в .Net3.5 на примере парсинга текста ;)
                +1
                а еще, разве в последнем.нете необходимо обьявлять тип переменной если он очевиден?
                ну Вы же для себя программу пишете. Чем плохо указать нормальный тип, а не var? var подойдет для Linq, Например, с помощью LINQ to SQL выгребли объекты, а потом в цикле foreach (var a in obj) {...}
                Удобно, и не надо узнавать, что там у нас за тип.
                  0
                  А через Object нельзя? Или там приводить еще придется?
                    0
                    Вполне возможно, а может и невозможно :). Но с использованием var у нас переменные будут анонимного типа. В том же селекте для Linq2Sql при помощи ключевого слова new можно выгрести только те поля объекта, которые нам необходимы. msdn.microsoft.com/ru-ru/library/bb397696.aspx вот тут немного можно коснуться этого.
                  0
                  Вот за такой подход, нужно стрелять на месте. Представьте насколько сложен будет код если всё будет объявляться var.
                  Притом не стоит забывать: «Код нужно писать, так как будто его будет сопроваждать психически-неуравновешанный маньяк, который знает где вы живёте». :)
                  0
                  Идея написания таких статей — идея на «5 с плюсом».
                  Но, хотелось бы все-таки уточнить для кого эти статьи? и после этого держаться выверенного курса, что бы те кто «покруче», не возмущались тому, что слишком просто, а те кто только начал изучать «не испугались бы».
                  Но мне кажется что большинство ждало некоторых изюминок C#, таких, например, о которых писал Дж. Рихтер. ;)
                    +4
                    Необращайте внимание. Иногда тут пробигает толпа троллей. Да и под горячую руку можно попасть :)

                    PS: А статьи пишите…
                    +2
                    Кстати, из литературы еще мне нравится Трей Нэш. «C# 2008. Ускоренный курс». Книга именно о синтаксисе и фичах самого языка, очень мало воды на мой взгляд, хорошо читается.
                      +1
                      Мне нравится=)

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

                      Не забудьте упомянуть потом работы с БД (SQLite идеально подходит, ИМХО) и DataGrid — по этому не очень много дельных мануалов в гугле, AFAIK.)

                      В последний раз копал гугл ещё на тему эффективной работы с http — получение и разбор — тоже, на мой взгляд, будет интересно описать)

                      Ну и, когда до string разбора дойдете — регулярки, ага!!)
                        0
                        Опечатки кстати — не /n/t, а \n\t

                        коретки => каретки

                        что бросается в глаза)
                          +1
                          Спасибо понравилось!!!
                            0
                            А что вы скажете о книге C# в примерах и задачах?
                              +1
                              Посмотрите на книгу «Delphi в примерах и задачах» от тогоже автора
                              www.chtivo.ru/chtivo=3&bkid=487382.htm

                              И вам сразу все станет ясно (Подсказка: у этих книг даже кол-во страниц приблизительно одинаково:)
                              +1
                              Эээ… а как же уже практически классическая книга Рихтера?
                                0
                                CLR via C#?
                                  0
                                  В данном контексте наверное именно она.
                                +1
                                Единственная стоящая книга.
                                Всё остальное можно узнать в msdn.
                                • UFO just landed and posted this here
                                    0
                                    Вот все мне говорят что книга тяжелая.

                                    На самом деле с неё почерпнул очень много информации по проблемам которые могут встретиться. Да и текст читается легко. Все таки дядька знает о чем пишет… а то бывают такие книжки, что хоть стой, хоть падай, особено с русским переводом…
                                  0
                                  На 18 строке мы добавили Console.ReadLine() — это сделано для того, чтобы после запуска программы консоль не закрывалась.

                                  Такие маленькие программки, чтоб не писать лишнюю строчку кода (да, я ленивый студент :), можно компилировать и вызывать по <Ctrl+F5> вместо <F6>. Тогда после выполнения программы консоль тоже не закроется, а будет ожидать действия пользователя.
                                    0
                                    * вместо <F5>, разумеется.

                                    Сказанное справедливо для MS VS 2005 и 2008.
                                      0
                                      В свое время этого «долго» не знал. И теперь мне легче набрать «Console.ReadLine()»…

                                      PS: Не люблю клавишу Ctrl :)
                                        +1
                                        Ваша правда, у неё такое название страшное… :-)
                                    +2
                                    в списке книг я бы еще упомянул книгу Троелсена «C# и платформа .NET. Библиотека программиста » www.piter.com/book.phtml?978531800750 и Рихтера CLR via C#. Программирование на платформе Microsoft .NET Framework 2.0 на языке C#. Последняя полезна для общего развития.

                                    И как пожелание, расскажите еще про NUnit и NAnt, первый это фреймворк для тестов, а второй — система сборки проектов.

                                      0
                                      Троелсен очень хорош, я с него шарп изучать начинал — написано доступно, емко и качественно.
                                      0
                                      Проблема в том, как правильно здесь заметили, надо бы выбрать точную аудиторию. Я думал, что после первой статьи это станет ясно, но так и не знаю…
                                        +1
                                        Думаю, что все-таки бОльшая часть аудитории хабра не нуждается особо в пояснениях что такое переменная или ее тип, в общем базовых для многих языков понятиях, тут можно оперировать фразами «статическая типизация», «обязательно объявление и иницализация переменных», «ветвление реализуется так-то, а наследование так-то»,. Но в тоже время мне кажется, что не стоит рассчитывать на то, что человек хоть что-то знает о C# и .Net.

                                        Может стоит ориентироваться на c/perl/php веб-программиста, которому или понадобилось сменить платформу своих серверных приложения с *nix (если планируется рассказ об asp.net), или написать сначала консольное, а потом гуишное приложение под Windows (с ремарками про моно)? Ну или хотя бы студента уже сдавшего курсовик на Паскале :)
                                        0
                                        Ага, но чтобы код работал и работал одинаково под всеми платформами и реализациями .net, нужно чтобы он соответствовал CLI
                                          0
                                          )))) Как раз только что закончил делать лабораторки по C# в универ и решил перед сном хабр почитать. А делал я их как раз в mono под Убунтой
                                            0
                                            а как у Mono с быстродействием? часто наталкиваюсь на сообщения о его тормознутости… дескать и оперативный компилятор плохой и сборщик мусора тормоз…
                                              –1
                                              Попытаюсь ответить на первый вопрос. Мне просто кажется что C#, .NET и майкрософт не совместимы с термином *nix. Коммерческие продукты они и есть коммерческие продукты, и платформу .NET никогда не портировать в *nix так, чтобы оно того стоило. А C# да, хороший язык, но примитивные вещи написанные на C# в 8 раз медленнее чем то же самое написанное на Си, так что нот гуд. Корпоративные системы будут продолжаться писаться в Си и С++. :) За статью спасибо. Ставлю плюс.
                                                0
                                                Ну так С# (читай весь .NET) не для примитивных вещей заточен. А скорее наоборот — помогает разработчику не задумываться над реализацией этих примитивных вещей и воспользоваться готовой, универсальной, оттестированной и безопасной, ну и медленной, как следствие. Здесь уже кому что важнее — быстрота разработки или же скорость работы. Хотя это можно и комбинировать — писать особо критичные к ресурсам модули по-старинке, на С++, а остальное на .NET языке. Также замечу, что в последней 2008-й студии можно создавать только .NET проекты. Этим создатели недвусмысленно намекают, что пора уже переходить на новую платформу.
                                                  0
                                                  Ну да, вы меня правильно поняли :) А по поводу последней 2008-й студии (VS9 насколько мне известно) ничего не понял, в каком смысле только .NET проекты? Не знаю последняя ли у меня, пару месяцев назад ставил, ну писать Си и С++ я всё ещё могу…
                                                    0
                                                    >что в последней 2008-й студии можно создавать только .NET проекты

                                                    Вы вообще 2008ю студию открывали? Там наоборот улучшили поддержку плюсов. Ну и кроме того можно создавать проекты инсталляции и проекты, относящиеся к БД.

                                                    >Этим создатели недвусмысленно намекают, что пора уже переходить на новую платформу.

                                                    По-моему они уже давно на это не намекают, а практически в открытую говорят об этом.
                                                      0
                                                      Вполне может быть. Так как я ее нашел в феврале прошлого года, а когда там был релиз в России? И я еще удивлялся — а где MVC проекты… Но с тех пор я перешел на C# Express Edition. Плагинов не хватает, а так всем доволен.
                                                        0
                                                        А MVC отдельно доставлять нужно ;), они в стандартную установку пока что не входят. Вроде в 2010 студии уже будет по принципу AS IS.
                                                        0
                                                        Всё это есть и в 2005, если ставить полную установку, а не урезанную.
                                                          0
                                                          Знаю, но я ничего не говорил про 2005ю.
                                                        0
                                                        > ну и медленной, как следствие. Здесь уже кому что важнее — быстрота разработки или же скорость работы.

                                                        Я бы сказал ЧУТЬ ЧУТЬ медленнее :) ну а плюсы того, что код получается в разы безопаснее, за более короткое время(относительно разработки на плюсах) очень сложно окупить… особенно когда в команде много людей и все эти люди дорогие специалисты… А в вэб приложениях, если нехватает скорости, то всегда можно за небольшую сумму денег(относительно стоимости разработки)купить железо быстрее.

                                                        > Хотя это можно и комбинировать — писать особо критичные к ресурсам модули по-старинке, на С++, а остальное на .NET языке.

                                                        .Net можно очень красиво и эффективно оборачивать библы написанные не на .Net(есть сторонние кодогенераторы которые могут сделать это автоматически), а в 4й версии с появлением dynamic будет ещё проще :)
                                                      0
                                                      «размерные и ссылочные.» — может правильным будет «значимые и ссылочные»?
                                                        +1
                                                        На счет воды.
                                                        А давайте люди прошаренные будут очень быстро прочитывать эту «воду» и заострять внимание на интересном им материале, и больше не предлагать нерациональных вещей? Зачем исключать часть аудитории, ради удобства остальной ?(в нашем случае, я думаю, это не оправданно)
                                                          0
                                                          На начальном этапе для меня настоящим откровением стало то, что вместо "\n" пришлось использовать Environment.NewLine :)
                                                            +1
                                                            вроде можно и так "\r\n"
                                                              0
                                                              Не переносимо :) Как минимум три варианта кодирования новой строки есть — Windows, *nix и MacOS
                                                                0
                                                                А NewLine получаетс вроде как платформонезависимо. Мелочь, а приятно :)
                                                            0
                                                            а я С# изучаю по Герберту Шилдту. Все доходчиво, подробно и понятно написано)
                                                            C# 2.0. Полное руководство
                                                              0
                                                              Отличная книга, далее советую тебе Pro C-Sharp 2008 and the NET 3.5 Platform (английский).
                                                              0
                                                              У вас ошибка в коде:
                                                              short х;
                                                              int у — 5; // здесь вместо - должно быть =
                                                              х = у; //не скомпилируете
                                                                0
                                                                IronRuby там в глубокой ж… aльфе находитцо, IronPython в бетте — нах такой друзей.
                                                                Единственно что может предствлять интерес как наиболее завершенная — это Nemerele, JavaScript.

                                                                для Object Pascal я чота вот не увидел бесплатных компиляторов. А так есть zonnon, который почемуто не упоминается на странице поддерживаемых езыков.
                                                                  +1
                                                                  Было бы интересно почитать про ограничения Mono по сравнению с родным .NET Framework'ом.
                                                                    0
                                                                    Если будете писать про методы, боксинг помяните?
                                                                      0
                                                                      Большое спасибо автору, так как в програмировании нуб, а елементарные основы как раз кстати:)

                                                                      Only users with full accounts can post comments. Log in, please.