Как стать автором
Обновить

Комментарии 51

Интерфейсом в C# является тип ссылок

Вы либо плохо говорите по-русски; либо не понимаете, что пишете; либо вы промт; либо уже вечер и вы жутко устали — тогда в следующий раз отложите пост на утро.
Спасибо, исправил. Надо было отложить пост. Просто после часа писанины не так было легко потом всё 100% проверить, что мне собственно и не удалось.
Однако есть и подводные камни! Например для установки размера массива нельзя использовать переменную

В чём смысл примера после этой фразы? Показать что вне зависимости от того, делаем ли мы константой неиспользованную переменную len, массив так создать не получится?
Или там что-то другое должно быть?
Извините, что Вы, что постом выше правы — надо было отложить пост до утра. Сейчас исправлю.
Ничего, не извиняйтесь. Если бы не завтрашний экзамен, сегодняшняя 4 чашка Java выглядела бы так же :)
[offtop]
Добавил в други. Есть интересное предложение для тебя.
[offtop]
НЛО прилетело и опубликовало эту надпись здесь
Недописал одно слово. Исправил.
Это не бред. Значимые типы не поддерживают наследование в вашем коде. То, что вы написали, это не наследование, а реализация интерфейса, это разные вещи. При наследовании вы получаете все поля, методы, свойства и т.п., определенные в базовом классе, методы у вас идут уже реализованные. При реализации интерфейса вы должны сами создать реализацию методов интерфейса, сама запись B: IA значит не более того, что вы обязуетесь создать в структуре B методы, описанные в IA. Интерфейс по сути — это просто контракт, без его реализации в определении интерфейса.
НЛО прилетело и опубликовало эту надпись здесь
Не знаю как для всех, но для меня получилось (с учетом упомянутых выше огрехов)

>Надо было отложить пост. Просто после часа писанины не так было легко потом всё 100% проверить, что мне собственно и не удалось.
Угу, хорошее решение дать посту «отлежаться». Думаю мы можем потерпеть небольшую паузу в выпусках, а периодичность по идее измениться не должна после «отлежевания» первого

string[] Privet = «раз, два, три».Split(',');

а вообще у меня компилируется и так:

string[] Privet = new string[] {«раз», «два», «три»};
и так: string[] Privet = new {«раз», «два», «три»};

Впрочем енто может фенечка дотнета 3.5
массивы в .Net не являются полностью динамическими, хоть их и можно ресайзить.
(http://www.gotdotnet.ru/Forums/Windows/18316.aspx)

советую юзать Generics.
Generics сами по себе никакого отношения к динамичности и к массивам, и даже к коллекциям не имеют. Просто удобно и производительно создавать типизированные коллекции, используя generic'и. Динамические коллекции в .NET были и до дженериков — например, ArrayList, другой вопрос, что типизированные коллекции (List?lt;T> и т.п.) — лучше.
ммм наверно не так выразился…
я противопоставил генерики массивам, а это ошибочно.

Я имел ввиду что зачастую если выходим за рамки массивов или хотим большего удобства,
лучше юзать ArrayList/List
Да, как-то за последние 2 года ни разу «чистые» массивы не использовать, всё какие-либо List:)
я иногда использую для хранения очередей определенных, когда например много потоков выхватывают для себя работу из массива int к примеру…
Я думаю стоит вернее выразиться, ибо не все Generics — коллекции ;).
Есть коллекции Generics, которые сейчас очень активно используются, но те кто начинал с первой версии помнят, что там Generics не было, а были коллекции аля ArrayList, которые работали с типом Object. А тип ArrayList никуда не делся :).
Забыл дописать что Generics — это всё-таки аналог шаблонов в С++.
Замечу следующее: что разница между шаблонами в C++ и обобщениями в C# в том что их расширение происходит динамически, а шаблонов в C++ статически.
И получаем выигрыш от использования обобщений с типами значений. В том же ArrayList приходилось упаковывать и распаковывать значения, этого не случается при использовании обобщений для типов значений.
Я предпочитаю использовать термины «во время компиляции» и «во время исполнения», это на мой взгляд понятнее звучит. Хотя и то и то определене является правильным. Да, различий намного больше если верить MSDN.
Да вы правы :)
О, уже интереснее) я думаю, полезен бы был краткий список основных классов (ну вот типа String, Array и что там еще часто используется) и их основных (самых используемых) методов, просто чтобы представлять что есть, не читать же всю документацию.
ссылочке на сравнение производительности скоро уж 4 года, каково же актуальное положение вещей?
спасибо за статью, но я немного позанудствую

класс (теоритически можно использовать структуру вместо класса)
правильно теоретически,
по поводу enum'ов не совсем корректно.

DaysOfWeek.Wednesday вернет не 2.
Для преобразования в int нужен явный каст — (int)DaysOfWeek.Wednesday.
А используя метод ToString() можно получить его название

Поэтому работая со стрингами (и всякими String.Format) помнить об этом.
Пример:
Console.WriteLine(«One — » + DaysOfWeek.Wednesday + ", Two — " + (int)DaysOfWeek.Wednesday);
Выведет «One — Wednesday, Two — 2»
ИМХО, сумбурный пост, который только добавит путаницы в головах неофитов C#. Многие упомяные вещи рассмотрены настолько вскользь, что можно было их и не упоминать, все равно в книгах написано лучше. Для начинающих могу дать совет — исользуйте Reflector и читайте с его помощью код, написанный опытными C#-программистами, тот же код самого .NET. Там уже будут хорошие примеры использования всего, чего угодно.
ИМХО, сумбурный пост, который только добавит путаницы в головах неофитов C#. Многие упомяные вещи рассмотрены настолько вскользь, что можно было их и не упоминать, все равно в книгах написано лучше. Для начинающих могу дать совет — исользуйте Reflector и читайте с его помощью код, написанный опытными C#-программистами, тот же код самого .NET. Там уже будут хорошие примеры использования всего, чего угодно.
Сорри за дубль.
Вы знаете, читать код с помощью рефлектора конечно удобно, но неофитам это будет довольно сложно. Притом MSDN содержит, на мой взгляд, довольно не плохие примеры, которые стоит использовать, ну или хотя бы просмотреть.
Возможно, сложно, я с этим не спорю. Просто я сам начинал так, поэтому и дал совет использовать Reflector. MSDN, конечно, никто не отменял. (Правда, некоторые примеры кода там написаны индусами, и, при всем моем ненеуважении к этой нации, написаны в индусском стиле:) )
Хе, ну если уж нато пошло, то в разработке .Net индусы тоже участие принимали, так что это палка о двух концах ;).
А вы довольно грамотны в этом отношении, не знаю сколько на практике, но в теории разбираетесь очень хорошо. Приятно общаться :).
Повысил вам кучку в карме.
Спасибо)
Попорядку:
В C# структура — это особый тип класса.

Вы меня простите, но это бред. Структура — определённый пользователесь value-type, но ни как не тип класса.
DaysOfWeek.Wednesday

Вернёт Wednesday, но никак не 2. Может вернуть 2 если будет приведение к типу int… Выше про это писали уже в комментах.

Затем объясните, почему у вас
//Что эквивалентно
string[] Privet = new string[] {«раз», «два», «три»};

вроде всё «в шоколаде», а парой строк вниз, стоит пометка что код не компилируемый?
//Не скомпилируется
string[] Privet = new string[] {«раз», «два», «три»};


Вот ещё
Массивы в языке C# являются настоящими динамическими массивами.

А может лучше было указать, что это класс?

Я конечно прочитал, что статья не вычитана и ещё сырая. Но думаю стоило бы повременить и подготовить качественный материал.
Простите мне мою излишнюю эмоцианальность :).
>>Вы меня простите, но это бред. Структура — определённый пользователесь value-type, но ни как не тип класса.

Три книги говорят об обратном. Тем более книги не уровня «C# за пять минут»

>>Вернёт Wednesday, но никак не 2. Может вернуть 2 если будет приведение к типу int… Выше про это писали уже в комментах.

Дайте мне ссылку где про это посмотреть? Енумами пользуюсь очень редко, но книги и статьи в интернете говорят опять таки обратное? Например вот devoid.com.ua/csharp/csharp-for-beginners/enumerations-in-csharp.html

>>вроде всё «в шоколаде», а парой строк вниз, стоит пометка что код не компилируемый
Извините. Сейчас исправлю. Это следствие копи-паста предыдущих строк

1. Хе, со мной можно поспорить, с MSDN — нет ;)
structure
A user-defined value type. Like a class, structures can contain constructors, constants, fields, methods, properties, indexers, operators, and nested types. Unlike classes, however, structures do not support inheritance. See also: class, field, indexer, nested type, property, value type.

2. А зачем ссылку, можно обратиться к отладчику(прошу заметить, что отладчик не использует ToString(), а отображает как оно есть на самом деле)

Я думаю по картинке видно что содержится :)
Хм… Странно. Значит книги нас обманывают о_О
На работе есть только одна книга — C# для профессионалов (которая в двух томах) и она
, я думал, достаточно авторитетна.
Один из авторов этой книги, случайно не Ватсон?
Знаете, наверное, в чём проблема. В том что книги переводят люди, которые технически безграмотны(не все книги, но есть отдельные экземпляры). Вот, как раз, один из этих печальных примеров и есть Ватсон. Может его книги и не плохи, но перевод у них отвратительный.
Важное дополнение — память под объекты классов выделяется в heap'e, а под структуры напрямую в стеке.
Именно в этом причина того, что не особенно рекомендуется делать структуры большими-память в стеке не резиновая :)
> //ToString() — переводит из int в string

я бы сказал, что это общий метод для всех классов, наследуемый от Object, и переводит все что угодно в String
Я это уже указывал, когда говорил про Object в прошлом «ведре»
Надо добавить еще про Array.Sort, что он сортирует с использованием Comparer'а по умолчанию. То есть если пользователь пишет свой тип, то ему необходимо определить интерфейс IComparable, иначе, при вызове Sort() кинется эксепшн.
Насчет книг — возьмите Троелсена, лучше в оригинале

Самая лучшая книжка для изучения .net с нуля. Пригодится в ваших статьях-выжимках.

Немного непонятен, вы простите меня конечно, смысл ваших статей. Изучать c# по ним, в лучшем случае, нужно с опаской — потому как неясен ни ваш опыт, ни ваши цели. Я так понял, вы хотите написать еще одну книгу по .net c# — это похвально, но хватит ли сил и как вы оцениваете полноту материала?
У меня небольшое пожелание: может есть смысл в начале каждой новой статьи приводить ссылки на все предыдущие?
Однако есть и подводные камни! Например для установки размера массива нельзя использовать переменную
Если статья рассчитана на начинающих, можно было бы рассказать, как всё-таки сделать подобное с переменной, а то остаётся отрывочные сведения после прочтения :) Всё-таки создание массива длинной, заданной не на этапе компиляции — намного более распространённое дело, чем ощущение разницы между классом и структурой.
дополнения/исправления.

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

«Здесь мы используем целые значения, которые соответствуют дням недели. Доступ к конкретному дню недели можно получить вот так: DaysOfWeek.Wednesday вернет 2»
Про enum'ы выше уже говорили, можно добавить, что синтаксис позволяет явно задать тип enum'а, например 'enum X: byte { a = 0 }', но даже в таком варианте нужно явное приведение к численным типам. Дополнительную информацию о конкретном экземпляре enum'а можно узнать через класс Enum.

«Делегаты — это типы, которые ссылаются на методы. Они похожи на указатели функций в C++, но разрешают создавать экземпляр класса и вызывать как статичные методы, так и методы конкретного экземпляра класса.»
Все делегаты являются наследниками MulticastDelegate и содержат в себе набор пар (ссылка на объект; ссылка на метод объекта). Делегаты ничего не создают.

«C# позволяет нам создавать массивы не инициализируя их, поэтому они могут менять размер в ходе выполнения программы.»
не совсем так. приближенно — все массивы являются типом Array, и в вашем примере разделено обявление переменной объекта и её инициализация конструктора. после создания размер не меняется.
Первое неверно — и в классах, и в структурах члены по умолчанию приватные
Автор об этом и говорит, противопоставляя C# и C++, где члены структур публичны по умолчанию.
НЛО прилетело и опубликовало эту надпись здесь
По повожу переменных не соглашусь, а вот про транслит всё просто — хотелось как можно понятней. Дело в том, что когда я обзываю переменную транслитом, то я хочу всего лишь показать, что это имя мы сами придумали, а не какое либо слово специальное. В универе у студентов часто возникала с этим проблема на момент понимания.
НЛО прилетело и опубликовало эту надпись здесь
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории