Комментарии 51
Интерфейсом в C# является тип ссылок
Вы либо плохо говорите по-русски; либо не понимаете, что пишете; либо вы промт; либо уже вечер и вы жутко устали — тогда в следующий раз отложите пост на утро.
Вы либо плохо говорите по-русски; либо не понимаете, что пишете; либо вы промт; либо уже вечер и вы жутко устали — тогда в следующий раз отложите пост на утро.
+2
Однако есть и подводные камни! Например для установки размера массива нельзя использовать переменную
В чём смысл примера после этой фразы? Показать что вне зависимости от того, делаем ли мы константой неиспользованную переменную len, массив так создать не получится?
Или там что-то другое должно быть?
-1
НЛО прилетело и опубликовало эту надпись здесь
Недописал одно слово. Исправил.
0
Это не бред. Значимые типы не поддерживают наследование в вашем коде. То, что вы написали, это не наследование, а реализация интерфейса, это разные вещи. При наследовании вы получаете все поля, методы, свойства и т.п., определенные в базовом классе, методы у вас идут уже реализованные. При реализации интерфейса вы должны сами создать реализацию методов интерфейса, сама запись B: IA значит не более того, что вы обязуетесь создать в структуре B методы, описанные в IA. Интерфейс по сути — это просто контракт, без его реализации в определении интерфейса.
+2
Не знаю как для всех, но для меня получилось (с учетом упомянутых выше огрехов)
>Надо было отложить пост. Просто после часа писанины не так было легко потом всё 100% проверить, что мне собственно и не удалось.
Угу, хорошее решение дать посту «отлежаться». Думаю мы можем потерпеть небольшую паузу в выпусках, а периодичность по идее измениться не должна после «отлежевания» первого
>Надо было отложить пост. Просто после часа писанины не так было легко потом всё 100% проверить, что мне собственно и не удалось.
Угу, хорошее решение дать посту «отлежаться». Думаю мы можем потерпеть небольшую паузу в выпусках, а периодичность по идее измениться не должна после «отлежевания» первого
0
string[] Privet = «раз, два, три».Split(',');
а вообще у меня компилируется и так:
string[] Privet = new string[] {«раз», «два», «три»};
и так: string[] Privet = new {«раз», «два», «три»};
Впрочем енто может фенечка дотнета 3.5
а вообще у меня компилируется и так:
string[] Privet = new string[] {«раз», «два», «три»};
и так: string[] Privet = new {«раз», «два», «три»};
Впрочем енто может фенечка дотнета 3.5
0
массивы в .Net не являются полностью динамическими, хоть их и можно ресайзить.
(http://www.gotdotnet.ru/Forums/Windows/18316.aspx)
советую юзать Generics.
(http://www.gotdotnet.ru/Forums/Windows/18316.aspx)
советую юзать Generics.
0
msdn.microsoft.com/en-us/library/1ffy6686(VS.85).aspx
0
Generics сами по себе никакого отношения к динамичности и к массивам, и даже к коллекциям не имеют. Просто удобно и производительно создавать типизированные коллекции, используя generic'и. Динамические коллекции в .NET были и до дженериков — например, ArrayList, другой вопрос, что типизированные коллекции (List?lt;T> и т.п.) — лучше.
0
ммм наверно не так выразился…
я противопоставил генерики массивам, а это ошибочно.
Я имел ввиду что зачастую если выходим за рамки массивов или хотим большего удобства,
лучше юзать ArrayList/List
я противопоставил генерики массивам, а это ошибочно.
Я имел ввиду что зачастую если выходим за рамки массивов или хотим большего удобства,
лучше юзать ArrayList/List
0
Я думаю стоит вернее выразиться, ибо не все Generics — коллекции ;).
Есть коллекции Generics, которые сейчас очень активно используются, но те кто начинал с первой версии помнят, что там Generics не было, а были коллекции аля ArrayList, которые работали с типом Object. А тип ArrayList никуда не делся :).
Есть коллекции Generics, которые сейчас очень активно используются, но те кто начинал с первой версии помнят, что там Generics не было, а были коллекции аля ArrayList, которые работали с типом Object. А тип ArrayList никуда не делся :).
0
Забыл дописать что Generics — это всё-таки аналог шаблонов в С++.
+1
Замечу следующее: что разница между шаблонами в C++ и обобщениями в C# в том что их расширение происходит динамически, а шаблонов в C++ статически.
И получаем выигрыш от использования обобщений с типами значений. В том же ArrayList приходилось упаковывать и распаковывать значения, этого не случается при использовании обобщений для типов значений.
И получаем выигрыш от использования обобщений с типами значений. В том же ArrayList приходилось упаковывать и распаковывать значения, этого не случается при использовании обобщений для типов значений.
0
Я предпочитаю использовать термины «во время компиляции» и «во время исполнения», это на мой взгляд понятнее звучит. Хотя и то и то определене является правильным. Да, различий намного больше если верить MSDN.
0
Да вы правы :)
0
О, уже интереснее) я думаю, полезен бы был краткий список основных классов (ну вот типа String, Array и что там еще часто используется) и их основных (самых используемых) методов, просто чтобы представлять что есть, не читать же всю документацию.
0
ссылочке на сравнение производительности скоро уж 4 года, каково же актуальное положение вещей?
0
спасибо за статью, но я немного позанудствую
класс (теоритически можно использовать структуру вместо класса)
правильно теоретически,
класс (теоритически можно использовать структуру вместо класса)
правильно теоретически,
0
по поводу enum'ов не совсем корректно.
DaysOfWeek.Wednesday вернет не 2.
Для преобразования в int нужен явный каст — (int)DaysOfWeek.Wednesday.
А используя метод ToString() можно получить его название
Поэтому работая со стрингами (и всякими String.Format) помнить об этом.
Пример:
Console.WriteLine(«One — » + DaysOfWeek.Wednesday + ", Two — " + (int)DaysOfWeek.Wednesday);
Выведет «One — Wednesday, Two — 2»
DaysOfWeek.Wednesday вернет не 2.
Для преобразования в int нужен явный каст — (int)DaysOfWeek.Wednesday.
А используя метод ToString() можно получить его название
Поэтому работая со стрингами (и всякими String.Format) помнить об этом.
Пример:
Console.WriteLine(«One — » + DaysOfWeek.Wednesday + ", Two — " + (int)DaysOfWeek.Wednesday);
Выведет «One — Wednesday, Two — 2»
0
ИМХО, сумбурный пост, который только добавит путаницы в головах неофитов C#. Многие упомяные вещи рассмотрены настолько вскользь, что можно было их и не упоминать, все равно в книгах написано лучше. Для начинающих могу дать совет — исользуйте Reflector и читайте с его помощью код, написанный опытными C#-программистами, тот же код самого .NET. Там уже будут хорошие примеры использования всего, чего угодно.
0
ИМХО, сумбурный пост, который только добавит путаницы в головах неофитов C#. Многие упомяные вещи рассмотрены настолько вскользь, что можно было их и не упоминать, все равно в книгах написано лучше. Для начинающих могу дать совет — исользуйте Reflector и читайте с его помощью код, написанный опытными C#-программистами, тот же код самого .NET. Там уже будут хорошие примеры использования всего, чего угодно.
+1
Сорри за дубль.
0
Вы знаете, читать код с помощью рефлектора конечно удобно, но неофитам это будет довольно сложно. Притом MSDN содержит, на мой взгляд, довольно не плохие примеры, которые стоит использовать, ну или хотя бы просмотреть.
0
Возможно, сложно, я с этим не спорю. Просто я сам начинал так, поэтому и дал совет использовать Reflector. MSDN, конечно, никто не отменял. (Правда, некоторые примеры кода там написаны индусами, и, при всем моем ненеуважении к этой нации, написаны в индусском стиле:) )
+1
Попорядку:
Вы меня простите, но это бред. Структура — определённый пользователесь value-type, но ни как не тип класса.
Вернёт Wednesday, но никак не 2. Может вернуть 2 если будет приведение к типу int… Выше про это писали уже в комментах.
Затем объясните, почему у вас
вроде всё «в шоколаде», а парой строк вниз, стоит пометка что код не компилируемый?
Вот ещё
А может лучше было указать, что это класс?
Я конечно прочитал, что статья не вычитана и ещё сырая. Но думаю стоило бы повременить и подготовить качественный материал.
Простите мне мою излишнюю эмоцианальность :).
В C# структура — это особый тип класса.
Вы меня простите, но это бред. Структура — определённый пользователесь value-type, но ни как не тип класса.
DaysOfWeek.Wednesday
Вернёт Wednesday, но никак не 2. Может вернуть 2 если будет приведение к типу int… Выше про это писали уже в комментах.
Затем объясните, почему у вас
//Что эквивалентно
string[] Privet = new string[] {«раз», «два», «три»};
вроде всё «в шоколаде», а парой строк вниз, стоит пометка что код не компилируемый?
//Не скомпилируется
string[] Privet = new string[] {«раз», «два», «три»};
Вот ещё
Массивы в языке C# являются настоящими динамическими массивами.
А может лучше было указать, что это класс?
Я конечно прочитал, что статья не вычитана и ещё сырая. Но думаю стоило бы повременить и подготовить качественный материал.
Простите мне мою излишнюю эмоцианальность :).
0
>>Вы меня простите, но это бред. Структура — определённый пользователесь value-type, но ни как не тип класса.
Три книги говорят об обратном. Тем более книги не уровня «C# за пять минут»
>>Вернёт Wednesday, но никак не 2. Может вернуть 2 если будет приведение к типу int… Выше про это писали уже в комментах.
Дайте мне ссылку где про это посмотреть? Енумами пользуюсь очень редко, но книги и статьи в интернете говорят опять таки обратное? Например вот devoid.com.ua/csharp/csharp-for-beginners/enumerations-in-csharp.html
>>вроде всё «в шоколаде», а парой строк вниз, стоит пометка что код не компилируемый
Извините. Сейчас исправлю. Это следствие копи-паста предыдущих строк
Три книги говорят об обратном. Тем более книги не уровня «C# за пять минут»
>>Вернёт Wednesday, но никак не 2. Может вернуть 2 если будет приведение к типу int… Выше про это писали уже в комментах.
Дайте мне ссылку где про это посмотреть? Енумами пользуюсь очень редко, но книги и статьи в интернете говорят опять таки обратное? Например вот devoid.com.ua/csharp/csharp-for-beginners/enumerations-in-csharp.html
>>вроде всё «в шоколаде», а парой строк вниз, стоит пометка что код не компилируемый
Извините. Сейчас исправлю. Это следствие копи-паста предыдущих строк
0
1. Хе, со мной можно поспорить, с MSDN — нет ;)
2. А зачем ссылку, можно обратиться к отладчику(прошу заметить, что отладчик не использует ToString(), а отображает как оно есть на самом деле)
Я думаю по картинке видно что содержится :)
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(), а отображает как оно есть на самом деле)
Я думаю по картинке видно что содержится :)
0
Хм… Странно. Значит книги нас обманывают о_О
На работе есть только одна книга — C# для профессионалов (которая в двух томах) и она
, я думал, достаточно авторитетна.
На работе есть только одна книга — C# для профессионалов (которая в двух томах) и она
, я думал, достаточно авторитетна.
0
Один из авторов этой книги, случайно не Ватсон?
Знаете, наверное, в чём проблема. В том что книги переводят люди, которые технически безграмотны(не все книги, но есть отдельные экземпляры). Вот, как раз, один из этих печальных примеров и есть Ватсон. Может его книги и не плохи, но перевод у них отвратительный.
Знаете, наверное, в чём проблема. В том что книги переводят люди, которые технически безграмотны(не все книги, но есть отдельные экземпляры). Вот, как раз, один из этих печальных примеров и есть Ватсон. Может его книги и не плохи, но перевод у них отвратительный.
0
Важное дополнение — память под объекты классов выделяется в heap'e, а под структуры напрямую в стеке.
Именно в этом причина того, что не особенно рекомендуется делать структуры большими-память в стеке не резиновая :)
Именно в этом причина того, что не особенно рекомендуется делать структуры большими-память в стеке не резиновая :)
0
> //ToString() — переводит из int в string
я бы сказал, что это общий метод для всех классов, наследуемый от Object, и переводит все что угодно в String
я бы сказал, что это общий метод для всех классов, наследуемый от Object, и переводит все что угодно в String
0
Надо добавить еще про Array.Sort, что он сортирует с использованием Comparer'а по умолчанию. То есть если пользователь пишет свой тип, то ему необходимо определить интерфейс IComparable, иначе, при вызове Sort() кинется эксепшн.
+1
Насчет книг — возьмите Троелсена, лучше в оригинале
Самая лучшая книжка для изучения .net с нуля. Пригодится в ваших статьях-выжимках.
Немного непонятен, вы простите меня конечно, смысл ваших статей. Изучать c# по ним, в лучшем случае, нужно с опаской — потому как неясен ни ваш опыт, ни ваши цели. Я так понял, вы хотите написать еще одну книгу по .net c# — это похвально, но хватит ли сил и как вы оцениваете полноту материала?
Самая лучшая книжка для изучения .net с нуля. Пригодится в ваших статьях-выжимках.
Немного непонятен, вы простите меня конечно, смысл ваших статей. Изучать c# по ним, в лучшем случае, нужно с опаской — потому как неясен ни ваш опыт, ни ваши цели. Я так понял, вы хотите написать еще одну книгу по .net c# — это похвально, но хватит ли сил и как вы оцениваете полноту материала?
+1
У меня небольшое пожелание: может есть смысл в начале каждой новой статьи приводить ссылки на все предыдущие?
0
Однако есть и подводные камни! Например для установки размера массива нельзя использовать переменнуюЕсли статья рассчитана на начинающих, можно было бы рассказать, как всё-таки сделать подобное с переменной, а то остаётся отрывочные сведения после прочтения :) Всё-таки создание массива длинной, заданной не на этапе компиляции — намного более распространённое дело, чем ощущение разницы между классом и структурой.
0
дополнения/исправления.
«Струтура в C# совершенно новая игрушка, не только по тому, что их члены по умолчания являются закрытыми, но экземпляры структур и экземпляры классов размещаются в различных местах памяти.»
Первое неверно — и в классах, и в структурах члены по умолчанию приватные. Отличие классов и структур только в хранении в памяти и том, что из этого следует (отсутствие наследования etc)
«Здесь мы используем целые значения, которые соответствуют дням недели. Доступ к конкретному дню недели можно получить вот так: DaysOfWeek.Wednesday вернет 2»
Про enum'ы выше уже говорили, можно добавить, что синтаксис позволяет явно задать тип enum'а, например 'enum X: byte { a = 0 }', но даже в таком варианте нужно явное приведение к численным типам. Дополнительную информацию о конкретном экземпляре enum'а можно узнать через класс Enum.
«Делегаты — это типы, которые ссылаются на методы. Они похожи на указатели функций в C++, но разрешают создавать экземпляр класса и вызывать как статичные методы, так и методы конкретного экземпляра класса.»
Все делегаты являются наследниками MulticastDelegate и содержат в себе набор пар (ссылка на объект; ссылка на метод объекта). Делегаты ничего не создают.
«C# позволяет нам создавать массивы не инициализируя их, поэтому они могут менять размер в ходе выполнения программы.»
не совсем так. приближенно — все массивы являются типом Array, и в вашем примере разделено обявление переменной объекта и её инициализация конструктора. после создания размер не меняется.
«Струтура в C# совершенно новая игрушка, не только по тому, что их члены по умолчания являются закрытыми, но экземпляры структур и экземпляры классов размещаются в различных местах памяти.»
Первое неверно — и в классах, и в структурах члены по умолчанию приватные. Отличие классов и структур только в хранении в памяти и том, что из этого следует (отсутствие наследования etc)
«Здесь мы используем целые значения, которые соответствуют дням недели. Доступ к конкретному дню недели можно получить вот так: DaysOfWeek.Wednesday вернет 2»
Про enum'ы выше уже говорили, можно добавить, что синтаксис позволяет явно задать тип enum'а, например 'enum X: byte { a = 0 }', но даже в таком варианте нужно явное приведение к численным типам. Дополнительную информацию о конкретном экземпляре enum'а можно узнать через класс Enum.
«Делегаты — это типы, которые ссылаются на методы. Они похожи на указатели функций в C++, но разрешают создавать экземпляр класса и вызывать как статичные методы, так и методы конкретного экземпляра класса.»
Все делегаты являются наследниками MulticastDelegate и содержат в себе набор пар (ссылка на объект; ссылка на метод объекта). Делегаты ничего не создают.
«C# позволяет нам создавать массивы не инициализируя их, поэтому они могут менять размер в ходе выполнения программы.»
не совсем так. приближенно — все массивы являются типом Array, и в вашем примере разделено обявление переменной объекта и её инициализация конструктора. после создания размер не меняется.
+1
НЛО прилетело и опубликовало эту надпись здесь
По повожу переменных не соглашусь, а вот про транслит всё просто — хотелось как можно понятней. Дело в том, что когда я обзываю переменную транслитом, то я хочу всего лишь показать, что это имя мы сами придумали, а не какое либо слово специальное. В универе у студентов часто возникала с этим проблема на момент понимания.
0
НЛО прилетело и опубликовало эту надпись здесь
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Учимся C#. Ведро третье