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