Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Windcastle от 28-08-2015, 18:30:21

Название: Оффтопик. Изучаем C#
Отправлено: Windcastle от 28-08-2015, 18:30:21
Объединил оффтопик из двух тем. Вопросы по изучению C#, которые не касаются AutoCAD .NET API прошу задавать здесь.
/* Александр Ривилис */


На простое решение рассчитывать не приходится! Да уж!
Название: Re: Изучаем C#
Отправлено: Windcastle от 28-08-2015, 20:17:48
Думаю, что это было бы для тебя проще.

Взял на вооружение! Иду качать!
Название: Re: Изучаем C#
Отправлено: Windcastle от 28-08-2015, 20:21:46
http://eknigi.org/programmirovanie/91446-c-40-polnoe-rukovodstvo.html

Это будет оптимальным решением.
Название: Re: Изучаем C#
Отправлено: Андрей Бушман от 28-08-2015, 20:26:17
На простое решение рассчитывать не приходится! Да уж!
В выложенном мною .net-решении сложного ничего нет. Исходный код подробно комментирован. Если есть конкретные вопросы по существу темы - можешь не стесняться спрашивать.
Название: Re: Изучаем C#
Отправлено: Александр Ривилис от 28-08-2015, 20:28:07
Если есть конкретные вопросы по существу - задавай.
Подожди. Вопросы будут скорее всего после (хотябы) поверхностного изучения C#. ;)
Название: Re: Изучаем C#
Отправлено: Андрей Бушман от 28-08-2015, 20:29:58
Вопросы будут скорее всего после (хотябы) поверхностного изучения C#.
Я не отслеживаю темы от Windcastle. Если там всё плохо с азами языка программирования, то конечно - сначала нужно мат. часть языка учить.
Название: Re: Изучаем C#
Отправлено: Александр Ривилис от 28-08-2015, 20:31:36
Windcastle == Пашин Евгений
Название: Re: Изучаем C#
Отправлено: Windcastle от 28-08-2015, 20:32:16
В выложенном мною .net-решении сложного ничего нет. Исходный код подробно комментирован. Если есть конкретные вопросы по существу темы - можешь не стесняться спрашивать.

А у Вас терпение железное? ))))))))) Вот у Александра Ривилиса с этим вроде как порядок )))))))))
Название: Re: Изучаем C#
Отправлено: Андрей Бушман от 28-08-2015, 20:33:02
Windcastle == Пашин Евгений
Ясно... :) Он же Гоша, он же Сева... Чем один логин не устроил? Вопрос риторический.
Название: Re: Изучаем C#
Отправлено: Андрей Бушман от 28-08-2015, 20:36:06
А у Вас терпение железное?
Нет. Глупые вопросы меня взрывают. Не ленись читать и я буду целее. :)
Название: Re: Изучаем C#
Отправлено: Андрей Бушман от 28-08-2015, 20:37:08
Это будет оптимальным решением.
Осталось дело за малым: прочитать этот кирпич... :)
Название: Re: Изучаем C#
Отправлено: Windcastle от 28-08-2015, 20:38:54
Нет. Глупые вопросы меня взрывают. Не ленись читать и я буду целее.

Да понятно... читать люблю! С пониманием плохо!

Ладно, не буду стонать. Буду стараться.
Название: Re: Изучаем C#
Отправлено: Windcastle от 28-08-2015, 20:42:53
Для меня он пока как "Война и мир" на китайском языке )))) Шучу!

Осилю и даже еще добавки попрошу  :)
Название: Re: Изучаем C#
Отправлено: Андрей Бушман от 28-08-2015, 20:43:09
читать люблю! С пониманием плохо!
Ну так для этого форумы и существуют. Если задавая вопрос ты обозначаешь материал, предварительно прочитанный и результаты поиска в Инете по непонятному вопросу, то реакция на вопросы будет иная, т.к. ты тем самым показываешь, что и сам прикладываешь усилия к тому, чтобы найти ответ на него.
Название: Re: Изучаем C#
Отправлено: Windcastle от 28-08-2015, 20:44:03
Но с C# я тут буду не в тему!
Название: Re: Изучаем C#
Отправлено: Windcastle от 28-08-2015, 20:46:26
Можно будет в личные сообщения вопросы задавать?
Название: Re: Изучаем C#
Отправлено: Андрей Бушман от 28-08-2015, 20:46:34
Но с C# я тут буду не в тему!
Вот  (http://stackoverflow.com/questions/tagged/c%23?sort=votes&pageSize=15)хороший дополнительный ресурс, где можно задавать вопросы по кодингу и около того.
Название: Re: Изучаем C#
Отправлено: Андрей Бушман от 28-08-2015, 20:47:48
Можно будет в личные сообщения вопросы задавать?
Нет, в личке этого лучше не делать, т.к. в случае открытого общения полезный ответ могут дать и другие форумчане. Можешь в личку присылать ссылки на свои вопросы, опубликованные на обозначенном мною выше ресурсе. Правда там отвечают быстро, возможно, что ответят и до того, как ссылку получу я. :)
Название: Re: Изучаем C#
Отправлено: Windcastle от 28-08-2015, 20:53:02
Так я ж по C# вроде как думал вопросы задавать. Просто не хотелось бы остаться с "китайской грамотой" один-на-один, а то глядишь и свихнусь, или мотивация в ноль уйдет.

Просто я считаю, что если я прочел книгу и не смог толково ее пересказать или объяснить, то значит я ее зря читал... Не хочу этого, но и мучать других не хочется. Просто хочется понимать настолько ясно, чтобы потом маленькому ребенку (пере/рас)сказать смог.
Название: Re: Изучаем C#
Отправлено: Андрей Бушман от 28-08-2015, 20:57:24
не хотелось бы остаться с "китайской грамотой" один-на-один
C# очень простой язык. Шильдт (да и не только он) излагает материал последовательно и понятно. Для освоения с нуля вполне подходит (как справочник). Я учился по Троелсену и использовал Шильдта как дополнительное чтиво + справочник.

Если C# для тебя и после чтения книг является "китайской грамотой", то вполне возможно, что программирование - это не твоё.
Название: Re: Изучаем C#
Отправлено: Windcastle от 28-08-2015, 21:20:03
Если C# для тебя и после чтения книг является "китайской грамотой", то вполне возможно, что программирование - это не твоё.

Я знаю чего Вам, Андрей, не хватает. Вам не хватает чуткости по отношению к начинающим. Меня лично Ваши слова "программирование - это не твоё" - задели, вернее мне вдруг уже захотелось закрыть книгу и не читать ее. Наверное, лучше знать тот язык, который понятен, а не тот, который популярен, хотя VB.NET тоже популярен.

Я может тоже не очень корректен был назвав книгу "китайской грамотой", за что извиняюсь.

Вы правы, Андрей, эту тему пора закрыть.
Название: Re: Изучаем C#
Отправлено: Александр Ривилис от 28-08-2015, 21:23:13
Меня лично Ваши слова "программирование - это не твоё" - задели, вернее мне вдруг уже захотелось закрыть книгу и не читать ее
Ну вот. А я только-только сказал Андрей Бушман, что он в этот раз удивительно деликатен. Обрати внимание, что это было не утверждение, и даже не предположение, а теоретическое рассуждение о такой возможности.

P.S.: Эту тему я как раз для такого оффтопика оставил.
Название: Re: Изучаем C#
Отправлено: Windcastle от 28-08-2015, 21:38:35
Я правда хочу, но становится как-то не по себе, когда кто-то утверждает / предполагает, что если не осилишь, значит не программист! Как если бы я только учился ходить и вдруг кто-то со стороны сказал: "Падает, да уж, наверное, ходить не сможет, а может и не дано!".

Я уверен, что если человек специалист в своем деле, то он сможет объяснить легко и просто даже ребенку то, что знает он, если конечно он действительно понимает и знает свое дело.
Название: Re: Изучаем C#
Отправлено: Windcastle от 28-08-2015, 22:06:45
Что такое рефлексия? Уже седьмой раз читаю это слово в книге, но не понимаю о чем идет речь?

В мире .NET рефлексией (reflection) называется процесс обнаружения типов во время выполнения. С применением служб рефлексии те же самые метаданные, которые отображает утилита ildasm.exe, можно получать программно в виде удобной объектной модели. Например, рефлексия позволяет извлечь список всех типов, которые содержатся внутри определенной сборки *.dll или *.ехе (или даже внутри файла *.netmodule если речь идет о многофайловой сборке), в том числе методов, полей, свойств и событий, определенных в каждом из них. Можно также динамически обнаруживать набор интерфейсов, которые поддерживаются данным типом, параметров, которые принимает данный метод, и других деталей подобного рода (таких как имена базовых классов, информация о пространствах имен, данные манифеста и т.д.).

Сразу неимоверное количество вопросов возникает:
1. Что подразумевают под метаданными?
2. рефлексией (reflection) называется процесс обнаружения типов во время выполнения... Чего? Типов данных?
3. Что подразумевают под удобной объектной модели... типа иерархическая структура (древовидная)?
4. если речь идет о многофайловой сборке... Это типа, когда я пишу EXE приложение, но в проекте еще дополнительно создаю проект библиотеку классов? Или что это?
5. полей ... Это контрол на форме или что?
6. имена базовых классов ... Это как в классе Человек.Голова.Рот.Сказать ("Здрасте"): именами базового класса Человек будут Голова и Рот?
7. Чем пространство имен отличаются от просто имен базового класса?
8. Манифест - это типа файл настроек? Или нет?
Название: Re: Изучаем C#
Отправлено: Windcastle от 28-08-2015, 22:20:19
Обрати внимание, что это было не утверждение, и даже не предположение, а теоретическое рассуждение о такой возможности.
Если C# для тебя и после чтения книг является "китайской грамотой", то вполне возможно, что программирование - это не твоё.

Речь идет не об абстрактном человеке, у которого может не получиться, а конкретно адресовано мне. Как бы эти слова программируют меня (вброс в подсознание), что я уже какой-то не-до-программист. Я не обижаюсь, я просто сделал вывод. Коим и поделился. Эти слова не похожи на Ваши, когда Вы мотивировали изучать C#, просто хотя бы потому что это язык для профессионалов... как будто это уже признак профессионализма. Вот это мотив, не правда ли?

Если из фразы  убрать "...вполне возможно, что...", то суть останется той же и соответственно и уже не идет речь о рассуждении, здесь уже, можно сказать, определился фактор, по которому можно судить: "Не понимаешь - значит не твое", причем не просто не твое (всмысле C#), а вообще любое программирование! Я увидел это так.
Название: Re: Изучаем C#
Отправлено: Александр Ривилис от 28-08-2015, 23:05:46
1. Что подразумевают под метаданными?
https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%B0%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B2_.NET
2. рефлексией (reflection) называется процесс обнаружения типов во время выполнения... Чего? Типов данных?
Типов данных, имён методов, свойств, событий, типов числа и порядка аргументов и т.д. и т.п.
3. Что подразумевают под удобной объектной модели... типа иерархическая структура (древовидная)?
Один раз возьми и воспользуйся утилитой ILSPY ( http://ilspy.net/ ) и посмотри при помощи неё какую-нибудь .NET-сборку. Например, acmgd.dll из каталога AutoCAD. Увидишь много интересного и полезного.
4. если речь идет о многофайловой сборке... Это типа, когда я пишу EXE приложение, но в проекте еще дополнительно создаю проект библиотеку классов? Или что это?
Можешь создавать сам, а можешь подключать уже готовые .NET-сборки (dll-файлы).
5. полей ... Это контрол на форме или что?
Нет. В C# есть понятие полей.
6. имена базовых классов ... Это как в классе Человек.Голова.Рот.Сказать ("Здрасте"): именами базового класса Человек будут Голова и Рот?
Нет. Про базовые классы и наследование двумя словами не скажешь.
7. Чем пространство имен отличаются от просто имен базового класса?
Это просто совершенно разные вещи. Пространство имён используется только для разделения понятий. Например, пространство имён AutoCAD и пространство имён Revit. И там и там допустим есть класс Point3d, но они совершенно по-разному устроены. Чтобы не было пересечений по именам будешь указывать AutoCAD.Point3d и Revit.Point3d в одном и том же модуле. Это я очень упрощенно...
8. Манифест - это типа файл настроек? Или нет?
Почитай: https://msdn.microsoft.com/ru-ru/library/1w45z383%28v=vs.110%29.aspx

P.S.: Мне кажется, что ты слишком на долго застрял на введении.
Название: Re: Изучаем C#
Отправлено: Александр Ривилис от 28-08-2015, 23:14:49
Я уверен, что если человек специалист в своем деле, то он сможет объяснить легко и просто даже ребенку то, что знает он, если конечно он действительно понимает и знает свое дело.
А вот тут ты совершенно не прав. Далеко не каждый очень классный программист может научить другого человека программированию. И далеко не каждый классный учитель программирования в состоянии создать программный шедевр. Талант учителя и талант программиста - это совершенно разные и зачастую непересекающиеся вещи. И это касается не только программирования. Есть множество случаев, когда спортсмен не достигший вершин в спорте становился тренером будущих олимпийских чемпионов. А эти олимпийские чемпионы, став в дальнейшем тренерами, не смогли вырастить себе достойную смену.
Как бы эти слова программируют меня (вброс в подсознание), что я уже какой-то не-до-программист.
Ну как бы защищайся. Как минимум докажи (на деле), что он не прав! :) Одних для достижения максимального результата нужно всегда хвалить, других постоянно ругать, третьи любят сочетания кнута с пряником...
Название: Re: Изучаем C#
Отправлено: Дима_ от 29-08-2015, 00:59:12
Я не обижаюсь, я просто сделал вывод. Коим и поделился. Эти слова не похожи на Ваши, когда Вы мотивировали изучать C#, просто хотя бы потому что это язык для профессионалов... как будто это уже признак профессионализма. Вот это мотив, не правда ли?
Раз уж создали тему для где можно флудить...
Да не переживай - Андрей грамотный специалист, постоянно и непрерывно поднимающий свою квалификацию (идя в ногу с технологиями) и охотно делящийся с ней со всем интернетом (реально тратящий на это много человеко-часов чистого альтруизма). Но стиль общения у него иногда пугает неподготовленного читателя - мне впрочем иногда тоже хочется обматерить очередного начинающего специалиста-программиста который печатать научился, а читать нет, причем еще бывает и особый вид - которые считают, что если он соизволил свой вопрос написать - который на первой-же строке гугла ответ высвечивает, то ему просто все обязаны.
Чтоб тебя успокоить - хотя успокоит-ли это - могу сказать, что я хоть и программист, но больше чем C# меня бесит только язык программирования 1С (VB.xxx я впрочем вообще не использую) - нет он мне более чем понятен, но писать я на нем не могу "физиологически" - тошнит. Если в книге много неясного, то возможно она либо не на твой уровень (все когда-то начинали), либо просто не твоим языком написанна - уверен - было-бы желание, C# может "осилить" абсолютно каждый - просто на это время требуется. Пробуй, пиши, не бойся ошибаться - меньше "копипасты", больше осмысленного кода - пробуй - а почему в книге так, а не попробывать вот-так - вникай в суть - на интересный вопрос тебе с удовольствием ответят (бывает глянешь на названия вопросов - и даже открывать их не хочется - только старый добрый Александр - дай бог Вам здоровья, искренне завидую широте Вашей души - и вытягивает).
А Андрей, наверное, еще не раз Вас "потролит" - ему можно - он "заслужил" такое право.
Название: Re: Изучаем C#
Отправлено: Windcastle от 29-08-2015, 08:34:09
"физиологически" - тошнит.

Так близко к истине ))) Точно такое же ощущение, когда не понятно )))

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

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

Да, в любом случае буду читать, стараться, но если я не пойму сути, то я не хотел бы быть осмеянным кем-то... А Андрей, наверное, еще не раз Вас "потролит" - ему можно - он "заслужил" такое право. - это не соответствует этике по большому счету. Если человек заслужил "корону", то он де-факто получил право на "издевательства" над некоронованными? О нет, я не за этим пришел. Когда я "вырасту", то я вынуждено выступлю антагонистом Андрею.
Название: Re: Изучаем C#
Отправлено: Windcastle от 29-08-2015, 08:41:16
Александр, доброе утро!

Итак, как я понял прочитанное:
1. Метаданные - это как карта городов (допустим России) с описанием каждого города, его краткой историей, описания его улиц с номерами домов, транспортных остановок, магазинов и т.д. Что-то типа структурированной (визуализированной) информации об объекте (страны под названием Российская Федерация). В нужном направлении думаю?

2. Рефлексия - это процесс, когда один объект отслеживает другой объект, определяет его метаданные. Что-то типа, когда молодой человек рассматривает девушку и определяет ее параметры, свойства и ее методы (ее возможности). Приблизительно так?

3. Посмотрел ILSPY и вижу упорядоченную, структурированную древовидную информацию по каждой библиотеке. Какие в каждую из них входят классы, какие у этих классов методы и свойства... Вроде так вижу.

4. То есть я пишу приложение *.exe, к нему могу подключать *.dll файлы (извне) или добавить в проект еще один проект библиотеки *.dll, которая будет зависеть от данного приложения *.exe. Но при этом созданная библиотека внутри может быть подключена другими приложениями. Так?

5. Поля - это не понятно!

Код - vb.net [Выбрать]
  1. Public Имя As String
  2. Public Property Фамилия As String

Вроде как внутри класса можно создать просто переменную, и можно также создать свойство, только понять не могу для чего это нужно, если и поле и свойство будут отображаться при использовании класса. Для чего используется поле? Свойство мне понятно! Это как цвет глаз у человека, например. Но если я создам поле с таким же названием цвет глаз, что принципиально стало другим? Не пойму!

6. Под вопросом так и остается.

7. То есть это как если были бы хоккейное и футбольное поле, но вратари в обоих случаях были бы разными. На футбольном поле это легко одетый человек, а на хоккейном поле тепло и защищенный от ударов шайбы. И потому у каждого из этих вратарей будут соответственно разные: свойства, методы, события и т.д. Верно понимаю? Значит использовать вратаря из хоккейного поля ни в коем случае использовать в футбольном поле нельзя, только если его имя и фамилию, к примеру. Так?

8. Манифест - это как общий перечень деталей автомобиля с описанием того, какая деталь от какой зависит. Правильно понимаю?


Подытожу, грубо говоря рефлексия - не что иное как процесс определения параметров объекта в процессе выполнения какой либо процедуры, а параметры заранее не известны.

Жду критики!

Название: Re: Изучаем C#
Отправлено: Дима_ от 29-08-2015, 11:50:23
Поля - это не понятно!
Windcastle - Вы молодец. Молодец в том, что задались этим вопросом (для меня это показатель, что Вы пытаетесь вникнуть в суть, а не прочитать). Да действительно, с точки зрения абстракции алгоритма разницы между ними нет - и это очень хорошо, что Вы мыслите именно абстрактными категориями - а не классами, полями, байтами и пр.
Проще всего понять что такое поля - это через их физический смысл - это раньше было необходимо для производительности, а сейчас для совместимости (в некоторых диалектах языков как представить член класса - как поле или как свойство решает оптимизатор транслятора). Когда вы создаете класс - компилятор запоминает его методы в одном месте памяти, а при создании каждого экземпляра объекта выделяется только тот необходимый минимум памяти, чтобы сохранить его данные (на которые и указывает ссылка, на объект - теперь Вам наверное более понятно - для чего нужна типизация - чтоб понять что можно делать с этими данными - как их "читать"). Так вот поля - это упрощенно говоря прямые ссылки на часть этих данных - а свойства - это методы (то есть вызываемые функции), которые созданы по определенным правилам - свойство может и не содержать никаких данных, а например, возвращать вычисления черт знает чего от чего, то-же самое при установке свойства - это не прямая запись в память - а запуск функции с определенными параметрами - которые могут например перед запоминанием переданного аргумента "зазиповать" его, а перед возвратом - раззиповать обратно.

з.ы. по остальному - смотрел правда бегло - вроде все верно.
Название: Re: Изучаем C#
Отправлено: Александр Ривилис от 29-08-2015, 12:22:27
Жду критики!
У меня возникло такое ощущение, что ты, еще не дочитав введение в детектив а уже спрашиваешь у того, кто прочитал, кто убийца. При этом вполне возможно, что убийцы нет, а есть вор... :)
Я понимаю твоё нетерпение, но я бы вернулся к этим вопросам после первого прочтения книги целиком.
На большую часть вопросов ты найдёшь ответы в книге сам. Зато появятся другие вопросы.
Отмечу лишь один вопрос:
4. То есть я пишу приложение *.exe, к нему могу подключать *.dll файлы (извне) или добавить в проект еще один проект библиотеки *.dll, которая будет зависеть от данного приложения *.exe. Но при этом созданная библиотека внутри может быть подключена другими приложениями. Так?
Не *.dll будет зависеть от *.exe, а наоборот. И этот *.dll, если он правильно спроектирован, может использоваться и с другими *.dll и/или *.exe
Название: Re: Изучаем C#
Отправлено: Андрей Бушман от 29-08-2015, 16:35:58
Цитата: Windcastle
Когда я "вырасту", то я вынуждено выступлю антагонистом Андрею.
"Хороший" полицейский? Ну всё, придётся мне на двг.ру уходить... :)
Жду критики!
Так обижаться же будешь опять, снова выискивая в замечаниях какой-то своеобразный смысл, который мною в них не вкладывался... Я, пожалуй, не буду комментировать твою "оптимистичную" реакцию, размазанную на целую страницу...

По поводу свойств хорошо разжёвывает материал Рихтер (CLR via C#). Почитай - очень доходчиво объясняет как и что работает. Применительно к свойствам и полям: никаких свойств в CIL на самом деле не существует. На самом деле это ни что иное как "синтаксический сахар" в языке C#. То, чем в коде ты оперируешь как "свойство", при компиляции в CIL будет преобразовано в пару методов, что-то вроде get_YourPropertyName() и set_YourPropertyName(). Если в свойстве только блок get будет объявлен как public, то public будет лишь первый из обозначенный методов (т.е. можно будет только получать значение свойства, но не править).

Назначение свойств (т.е. их get_*\set_* методов) в том, чтобы дать тебе полный контроль над доступом к скрытым полям. В коде свойств ты выполняешь нужные тебе предварительные проверки и принимаешь решение о том, предоставлять ли доступ к запрошенному полю или же, к примеру, генерировать исключение, или генерировать событие, сообщающее об изменении свойства (в коде set_* метода). Там же выполняешь проверку значения, прежде чем вернуть его (в get_* методе). Если же ты предоставляешь доступ к полю напрямую, через public, то не можешь контролировать этот доступ.

Кроме того, свойства позволяют инкапсулировать логику контроля доступа к полям и, в случае необходимости, править её, без необходимости править сторонний код, использующий эти свойства.

Думаю, что целесообразней тебе было бы изучать c# по Троелсену, а не по справочнику Шильдта.
Название: Re: Изучаем C#
Отправлено: Андрей Бушман от 29-08-2015, 17:33:24
Для чего используется поле?
поле должно хранить значение свойства (не важно, какова область видимости этого свойства). За поле, объявленное с модификатором доступа public нужно бить линейкой по рукам.
Цитировать
Манифест - это как общий перечень деталей автомобиля с описанием того, какая деталь от какой зависит. Правильно понимаю?
Всё тот же Рихтер, всё в той же книге и этот вопрос разжёвывает.
Цитировать
Что-то типа, когда молодой человек рассматривает девушку и определяет ее параметры, свойства и ее методы (ее возможности). Приблизительно так?
...
То есть это как если были бы хоккейное и футбольное поле, но вратари в обоих случаях были бы разными. На футбольном поле это легко одетый человек, а на хоккейном поле тепло и защищенный от ударов шайбы. И потому у каждого из этих вратарей будут соответственно разные: свойства, методы, события и т.д. Верно понимаю? Значит использовать вратаря из хоккейного поля ни в коем случае использовать в футбольном поле нельзя, только если его имя и фамилию, к примеру. Так?
Какие-то мутные у тебя аналогии...
Цитировать
Подытожу, грубо говоря рефлексия - не что иное как процесс определения параметров объекта в процессе выполнения какой либо процедуры, а параметры заранее не известны.
А что, этот (https://msdn.microsoft.com/ru-ru/library/system.reflection%28v=vs.110%29.aspx) текст был чем-то не понятным?
Название: Re: Изучаем C#
Отправлено: Дима_ от 29-08-2015, 18:01:59
никаких свойств в CIL на самом деле не существует. На самом деле это ни что иное как "синтаксический сахар" в языке C#.
Опс - граф - тут сразу несколько ошибочных утверждений, во первых не в языке C#, а во всем .Net. Во вторых это не "сахар" а конкретный механизм. Да создавая свойство XXX автоматически создадутся методы get_XXX и если и на запись,  то и set_XXX, через которые и будет обращение, но не наоборот - создав метод get_Abc() - свойство Abc не появится - и в "рефлекшине" соотв. записи не будет. Такая картина впрочем не только в .Net (в смысле автоматическое создание методов для доступа - чтоб не городить отдельный механизм).
Название: Re: Изучаем C#
Отправлено: Андрей Бушман от 29-08-2015, 18:06:28
тут сразу несколько ошибочных утверждений, во первых не в языке C#, а во всем .Net. Во вторых это не "сахар" а конкретный механизм.
Я писал:
Цитировать
никаких свойств в CIL на самом деле не существует.
Во первых, CIL - это не C#. Если нет в CIL, то нет и в языках более высокого уровня, т.к. их код компилируется именно в CIL.
Во вторых, термин "синтаксический сахар" не является моим, и часто используется в книжках, в частности в той теме, где как раз таки свойства и объясняются.

Цитировать
но не наоборот - создав метод get_Abc() - свойство Abc не появится - и в "рефлекшине" соотв. записи не будет.
Я и не писал этого. когда я писал о get и set, то имел соответствующие блоки кода в определении свойства.
Цитировать
Такая картина впрочем не только в .Net (в смысле автоматическое создание методов для доступа - чтоб не городить отдельный механизм).
Я в курсе. Это и называется "синтаксическим сахаром". Тот же Рихтер его так и называет.
Название: Re: Изучаем C#
Отправлено: Дима_ от 29-08-2015, 18:19:31
А я пишу, что в CIL они существуют и это не сахар см. в рефлексе, либо попробуй создать свойство созданием метода.
Название: Re: Изучаем C#
Отправлено: Андрей Бушман от 29-08-2015, 19:27:47
А я пишу, что в CIL они существуют и это не сахар см. в рефлексе, либо попробуй создать свойство созданием метода.

Цитата: Рихтер "CLR via C# 4 Edition" стр. 267
Поддержка свойств встроена в C#. Обнаружив код, пытающийся получить или задать свойство, компилятор генерирует вызов соответствующего метода. Если используемый язык не поддерживает свойства напрямую, к ним все равно можно обратиться посредством вызова нужного метода доступа. Эффект тот же, только исходный текст выглядит менее элегантно.

Помимо методов доступа, для каждого из свойств, определенных в исходном тексте, компиляторы генерируют в метаданных управляемого модуля запись с определением свойства. Такая запись содержит несколько флагов и тип свойства, а также ссылки на методы доступа get и set. Эта информация существует лишь затем, чтобы связать абстрактное понятие «свойства» с его методами доступа. Компиляторы и другие инструменты могут использовать эти метаданные через класс System.Reflection.PropertyInfo. И все же CLR не использует эти метаданные, требуя при выполнении только методы доступа.
Название: Re: Изучаем C#
Отправлено: Дима_ от 29-08-2015, 20:17:02
Ну так и с какого перепуга стандартная процедура CLI является синтаксическим сахаром языка С#. Я кстати в данной цитате нигде не увидел, что это он (сахар).
Название: Re: Изучаем C#
Отправлено: Андрей Бушман от 29-08-2015, 21:24:03
Ну так и с какого перепуга стандартная процедура CLI является синтаксическим сахаром языка С#. Я кстати в данной цитате нигде не увидел, что это он (сахар).
Цитата: "Jeffrey Richter" link=http://www.wintellect.com/devcenter/jeffreyr/clr-via-c-will-not-be-updated-for-net-3-5
In addition, .NET 3.0 shipped with C# 2.0 and so no changes were made to the C# language/compiler either. Of course, .NET 3.5 does ship with C# 3.0 which does offer many new features (automatically-implemented properties, implicitly typed local variables, extension methods, lambda expressions, object initializers, anonymous types, implicitly typed arrays, partial methods, query expressions, and expression tress). However, all of these features are just compiler syntactic sugar to make syntax easier for programmers.
Поправляюсь - синтаксическим сахаром он называл автоматические свойства.
Название: Re: Изучаем C#
Отправлено: Дима_ от 29-08-2015, 22:04:38
Это уже другой разговор - для Топикстартера (а может и не только его) поясню - автоматические свойства - это метод создания свойства при котором в неявном для программиста виде создаются закрытое поле в котором содержится значение, которое и возвращает/задает данное свойство - это безусловно синтаксический сахар.
з.ы. Цитата выше, кстати, хорошо объясняет почему меня раздражает c# - практически все перечисленное в ней - в чистом виде "функциональщина" - которую натягивают на не предназначенный для этого язык из другой парадигмы (ну он вроде как потомок с и с++) - ИХМО получается как седло на корове.
з.з.ы - То А. Ривилис - флудить Вы сами разрешили.
Название: Re: Изучаем C#
Отправлено: Андрей Бушман от 29-08-2015, 22:33:21
почему меня раздражает c# - практически все перечисленное в ней - в чистом виде "функциональщина" - которую натягивают на не предназначенный для этого язык из другой парадигмы
я ничего подобного не вижу.
(ну он вроде как потомок с и с++) - ИХМО получается как седло на корове.
Смотря что имеется в виду под "потомком". Да, синтаксис весьма похож, но это не то же самое, что С или C++. Код С89 можно компилировать в Visual C++, поэтому С++ - полноценный потомок С (у Стровструпа, кстати, есть хорошая книга по истории С++). Однако ни код C, ни код С++ откомпилировать в C# не удастся, поэтому родства подобного C\C++ у C# с этими языками всё же нет.

Программировать в С++ можно как в объектно-ориентированном, так и в функциональном стиле (решение за программистом) - эту возможность Стровструп оставил умышленно, т.к. считает, что не существует единственно верного способа программировать и все люди уникальны (каждый может найти своё хорошее решение задачи). В то же время C# - объектно-ориентированный язык. Функциональное программирование в нём невозможно. В то же время и С не является чисто-функциональным (тем более C++). Серебрянной пули не существует - нет языка, который идеально подходит под все сферы программирования. Это признаёт и Стровструп (создатель С++).

C#, на мой взгляд, достаточно прост в изучении (гораздо проще, чем С++). Когда я принял решение уходить с VBA, то выбирал между VB.NET и C#. Изначально хотел взять VB.NET, но посмотрев его синтаксис понял, что мне он понятней не более, чем синтаксис C#, т.к. общего у него с VBA не больше, чем у кошки и собаки. Выбрал C#, т.к. по нему больше материала и его вместо VB.NET в интернете рекомендовали авторитетные забугорные специалисты. Как показала практика - с выбором я не ошибся. Кроме того, в то время VB.NET уступал по функционалу языку C#. Это сейчас майкрософтом принято решение постоянно подтягивать VB.NET к возможностям C#, как жгут резиновый. Но это означает, что VB.NET всегда будет как минимум на шаг позади C# (имхо). Я не знаю, как у VB.NET дела обстоят сейчас, да и не интересно мне это.

Мне нравятся все три языка(C\C++\C#). Идеальных языков нет, у каждого есть свои преимущества и недостатки. Отторжение у меня вызывает разве что язык гоблинов (VB) и его аналоги: VBA, VB.NET, VBScript. Не знаю, вот коробит меня от него и всё, хотя когда-то сам же активно писал код на VBA в MS Access 2003 и выше (сейчас уже и забыл его).
Название: Re: Изучаем C#
Отправлено: Александр Ривилис от 29-08-2015, 22:51:00
з.з.ы - То А. Ривилис - флудить Вы сами разрешили.
А я от своих слов и не отказываюсь. :)
Название: Re: Изучаем C#
Отправлено: Дима_ от 29-08-2015, 23:17:12
То Андрей - цитату мою Вы не с начала вырвали - "перечисленное в ней" - это не про c# а про цитату из Вашего поста.
В то же время C# - объектно-ориентированный язык. Функциональное программирование в нём невозможно.
    Это с какого перепугу - а LINQ и анонимные функции - это что - да в чистейшем виде функциональщина - неудобно и криво сделано - да - о чем я и пишу (что понятно ибо это как скрестить ужа с ежом) - но она там гораздо более возможней, чем в тех же c и c++ - где даже сборка мусора отсутствует (ну в с++ там по моему какая-то затычка в этом роде была).
    ИХМО - большая часть всех "нововведений" C# (оно-же как и версии .Net) последних лет - имеют функциональную природу (кстати объектно-ориентированный язык  - это совсем не значит, что он императивный - он в равной степени может быть и функциональным - просто объекты у него по "умолчанию" не изменяются, а пересоздаются), готов обосновать на перечне нововведений любой из "последних" версий, а вся структура "родителей" (с,с++) - ну скажем так, не очень заточена под функциональное программирование - поэтому смотреть на ту реализацию нового - забытого старого без слез нельзя - хотя надо признать - делают, это самое скрещевание, на удивление качественно - иногда я бы даже сказал шедеврально - особенно с учетом "груза поддержки" всей предыдущей парадигмы языка.
Название: Re: Изучаем C#
Отправлено: Андрей Бушман от 30-08-2015, 09:49:01
Я очень даже в курсе, что многое из добавленного в C# взято из функциональных языков. Однако, на мой взгляд, реализовано это в нём достаточно удобно и не вызывает у меня отторжения. Перенимать положительный опыт других языков - в этом нет ничего зазорного. Главное, чтобы реализовано это было так, чтобы программисту было удобно этим пользоваться. То, как в C# реализованы методы расширения и LINQ, работающий на основе этого механизма, меня вполне устраивает. Работать с анонимными функциями мне так же удобно и мне не важно, откуда эти возможности были переняты.
Цитировать
кстати объектно-ориентированный язык  - это совсем не значит, что он императивный - он в равной степени может быть и функциональным - просто объекты у него по "умолчанию" не изменяются, а пересоздаются
Я знаю. Тогда это получается чисто-фунциональный язык.
Цитировать
вся структура "родителей" (с,с++) - ну скажем так, не очень заточена под функциональное программирование
Да, в них отсутствуют ленивые вычисления и они не являются чисто-функциональными. Но у них есть свои плюсы и основной из них - скорость работы. У меня нет желания вести религиозные войны.
Название: Re: Изучаем C#
Отправлено: Дима_ от 30-08-2015, 11:08:03
То, как в C# реализованы методы расширения и LINQ, работающий на основе этого механизма, меня вполне устраивает.
Если-б не было c# - то наверное и vb многих  устроил - это смотря с чем сравнивать.
Но у них есть свои плюсы и основной из них - скорость работы.
Этот аргумент лет 20 как потерял актуальность - к c# он точно не имеет никакого отношения (я думаю во всех Ваших кодах последних 5 лет не найдется, к примеру, ни одной итерации по индексу - а ведь так быстрей - а везде будет минимум foreach или вообще linq вызов, более того если Вы такое увидите - то первый предложите "бить линейкой по рукам" и это и с моей точки зрения правильно и подобных примеров в Ваших-же кодах - немерено).
Все выложенные коды на с#, потихоньку все более и более имеют функциональный стиль (Microsoft старается) - авторы в большинстве случаев этого сами не понимают, более того часто воспринимают это в штыки (видимо от слабого владения предметом - многие считают что функциональщина - это что-то медленное и неуклюжее).
Синтаксическая база С разработана и прекрасно работает - как своего рода продвинутый ассемблер Фон Нейманевской архитектуры - это факт подтвержденный сотнями практически совместимых между собой компиляторов различных архитектур и платформ (естественно не на уровне вызовов API - а на уровне как раз их создания). Но эта архитектура совсем не обладает гибкостью - linq - сделан не плохо - но по факту эта независимая отдельная надстройка у которой нет взаимодействия с самим языком (основным синтаксисом - пришлось по сути свой дополнительный вводить) - не так-ли? Получается смесь нарванных кусков из разных парадигм которые не свести к одному - нету целостности. Дело не в том, что там чего-то еще нет, хотя я думаю что когда в c# появятся активные шаблоны и провайдеры типов - Вы первый кто не будет представлять как Вы до этого без них писали. Дело в том, что пора понять что хлам надо выкидывать - он вроде и не мешает - но пыль с него протирать нужно, да и место занимает. Т.к., повторюсь, уже почти все пишут функциональщину и не замечают - но из-за поддержки всей остальной парадигмы не могут воспользоваться в "полную силу" - например тип "String" с самого начала .Net - функциональный - никто не задумывался, что это так - нет ни одной перегрузки метода по замене строки - везде порождает новую - и ничего никто по этому поводу не плачет, а ведь произвести оптимизацию на уровне компилятора на предмет можно-ли не "рожать" новую, а заменить старую - можно только в функциональном языке (или в глухо отведенной функциональной части - типа linq) - что произойдет с ней дальше в императивном языке компилятору не понятно (чтоб понять там надо такую логику включать - по сравнении которой все шахматные программы - детский лепет). Про параллельные вычисления я вообще промолчу.
Я все это к тому - хотим мы или нет с# в итоге все равно сильно "переродиться" и будет уже совсем не похож на нынешней (уже не похож). Тогда может и я начну на нем писать не плюясь.
Название: Re: Изучаем C#
Отправлено: Пашин Евгений от 31-08-2015, 09:48:11
А что, этот текст был чем-то не понятным?

К сожалению, не совсем, поскольку в следующем пункте шла речь о типах: классах, интерфейсах, делегатах, структурах, перечислениях.

Пространство имен System.Reflection содержит типы, предназначенные для извлечения сведений о сборках, модулях, членах, параметрах и других объектах в управляемом коде путем обработки их метаданных.

Когда попытался понять, что такое типы в System.Reflection оказался в ступоре, поскольку как я понял, это тоже классы, но каждый из них выполняет свои функции.

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

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

Спасибо за Рихтера! Скачал, попробую хотя бы по несколько страниц прочитывать-ИЗУЧАТЬ в день! ИЗУЧАТЬ, а не просто читать. Прогресс будет 100%.

По поводу полей попробую пересказать, что Вы имели ввиду:

Как я понял, в старом и добром VB6, создание классов и свойств класса тоже происходило с помощью полей и свойств:

Вот пример:

Код - Visual Basic [Выбрать]
  1. Private mvarРадиус As Single ' Это поле
  2.  
  3. Public Property Let Радиус(ByVal vData As Single) ' Это получение свойства
  4.    mvarРадиус = vData
  5. End Property
  6.  
  7. Public Property Get Радиус() As Single ' Это установка значения свойства
  8.    Радиус = mvarРадиус
  9. End Property

Когда я присмотрелся, я понял, что при использовании класса я не видел в списке свойств переменной mvarРадиус, но этот параметр успешно играл свою роль в работе класса (точнее свойства Радиус) и он тоже хранит в себе значение, все время, пока класс существует!

За поле, объявленное с модификатором доступа public нужно бить линейкой по рукам.

Грубо... получение ошибок - это тоже процесс обучения.

Зато становится понятным для чего нужно поле держать приватным Private mvarРадиус As Single.
Однако, я решил попробовать сделать подобное в Visual Basic 2013 и вот что у меня получилось:
Код - vb.net [Выбрать]
  1. Public Class Class1
  2.     Private _color As Boolean
  3.     Public Property Color As Boolean
  4.         Get
  5.             Color = Me._color
  6.         End Get
  7.         Set(value As Boolean)
  8.             _color = value
  9.             ' Здесь вставляется событие или процедура (а можно просто вызвать процедуру)
  10.         End Set
  11.     End Property
  12.  
  13.     Public Sub AnyThing()
  14.         Dim FLD As New Class1
  15.         FLD.Color = True ' Что же это получается, что я и поле могу использовать и свойство?
  16.         FLD._color = True ' Что же это получается, что я и поле могу использовать и свойство? Почему поле отображается, если оно PRIVATE
  17.     End Sub
  18.  
  19. End Class
  20.  

И поле и свойство - видимые! Что меня лично смущает.

Я что-то не понимаю, где моя ошибка?

Вроде сделал скрытым поле, а оно видимое... Напрашиваются вопросы:
1. Андрей линейкой будет махать?
 или
2. Андрей включит своего мудрого учителя и поможет понять в чем проблема?

Кроме того, свойства позволяют инкапсулировать логику контроля доступа к полям и, в случае необходимости, править её, без необходимости править сторонний код, использующий эти свойства.
Будьте человеком (вернее спуститесь с небес к людям) и объясните эту фразу как-нибудь проще... Можно на птичках, цветочках или т.п.?

Думаю, что целесообразней тебе было бы изучать c# по Троелсену, а не по справочнику Шильдта.
Учту!
Название: Re: Изучаем C#
Отправлено: Александр Ривилис от 31-08-2015, 10:07:41
Скачал, попробую хотя бы по несколько страниц прочитывать-ИЗУЧАТЬ в день!
А я бы посоветовал сначала один раз прочитать всю книгу, не сильно вдаваясь в детали. Причина очень простая - во введении и первых главах даются общие понятия без детализации. А их объяснение даётся в следующих главах. Количество вопросов сразу уменьшится.
Название: Re: Изучаем C#
Отправлено: Александр Ривилис от 31-08-2015, 10:09:23
FLD._color = True ' Что же это получается, что я и поле могу использовать и свойство? Почему поле отображается, если оно PRIVATE
Внутри класса оно доступно, но недоступно вне его.
Название: Re: Изучаем C#
Отправлено: Пашин Евгений от 31-08-2015, 10:29:50
Внутри класса оно доступно, но недоступно вне его.

Ok! Понял. Проверил и убедился )))


(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fs13.postimg.org%2F3xgesmhsz%2Fimage.jpg&hash=edc319cec0f459db348ac64c3ffa03e7) (http://postimg.org/image/3xgesmhsz/)
Название: Re: Изучаем C#
Отправлено: Андрей Бушман от 31-08-2015, 10:58:26
Напрашиваются вопросы:
1. Андрей линейкой будет махать?
 или
2. Андрей включит своего мудрого учителя и поможет понять в чем проблема?
Ты уж определись: либо ты обиженный, предельно вежливый интеллигент, либо ты поясничаешь (тогда нехрен обижаться) не понятно чего добиваясь.

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

Если в моём коде обнаруживается какая-то ошибка или некая глупость - я не обижаюсь, когда мне пишут, что я написал хрень. Если я смотрю в книгу и вижу фигу, то я не обижаюсь, если меня ткнут носом в то, что я пропустил. Мне не важно, в какой форме мне указывают на мои ошибки: в "вежливой", или "военной" - главное, чтобы замечание было по существу. Я не устраиваю размазывание соплей на пару десятков постов и тебе впредь не советую этого делать - сильно раздражает окружающих (и не только меня, поверь).
Название: Re: Изучаем C#
Отправлено: Андрей Бушман от 31-08-2015, 11:00:15
Внутри класса оно доступно, но недоступно вне его.
Я очень сомневаюсь, что в букваре об этом не пишут...
Название: Re: Изучаем C#
Отправлено: Андрей Бушман от 31-08-2015, 11:18:55
Цитировать
Кроме того, свойства позволяют инкапсулировать логику контроля доступа к полям и, в случае необходимости, править её, без необходимости править сторонний код, использующий эти свойства.
Будьте человеком (вернее спуститесь с небес к людям) и объясните эту фразу как-нибудь проще... Можно на птичках, цветочках или т.п.?
В редакторе сообщений есть специальная кнопка с тегом цитаты. Используй её вместо того, чтобы делать шрифт "жирным", дабы всем было понятно, что это именно цитата.

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

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

Разжёванный материал находится в книге, п.17 указанной мною здесь (http://adn-cis.org/forum/index.php?topic=400.0).

Цитировать
Будьте человеком (вернее спуститесь с небес к людям)
В контексте твоего вопроса это паясничанье идёт тебе не не пользу...
Название: Re: Изучаем C#
Отправлено: Александр Ривилис от 31-08-2015, 11:51:20
Тебе в любом случае ответит А.Н. Ривилис (ему придётся, не зависимо от того хочет он этого или нет ибо это его работа), так что от отсутствия моих сообщений ты ничего не потеряешь.
Уточняю. Я отвечу в любом случае, если вопрос будет связан с AutoCAD API. Но отвечать на вопросы по основам языков программирования я не обязан. И в большинстве случаев буду указывать, что нужно пользоваться поиском.
Название: Re: Изучаем C#
Отправлено: Пашин Евгений от 31-08-2015, 12:09:08
После прочитанного уже и не хочется никакого C#.

В C# ты уже наверняка читал об интерфейсах.

Читал, но не понял! Интерфейсами Вы называете то, что просто является кодом? Тогда Вы меня еще больше запутали.

В контексте твоего вопроса это паясничанье идёт тебе не не пользу...
У меня правда сложилось впечатление, как будто Вы какой-то царь, а я какой-то холоп. Вот я и подумал, что надо Вам об этом как-то сказать и как можно мягче. У меня похоже не получилось.

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

Ну и что это значит?


Странно, цитаты сработали на Александра Ривилиса...
Название: Re: Изучаем C#
Отправлено: Александр Ривилис от 31-08-2015, 12:14:19
1. Обрати внимание, что всё что ты процитировал написал не я, а Андрей Бушман. Т.е. кнопку "цитировать выделенное" ты нажимал не там где нужно.
2. Ты снова начинаешь задавать вопросы, не прочитав книгу. Дальше я буду отвечать на вопросы по C# только тогда, когда пойму, что ты уже её прочитал.
Название: Re: Изучаем C#
Отправлено: Андрей Бушман от 31-08-2015, 12:17:15
Цитировать
Читал, но не понял! Интерфейсами Вы называете то, что просто является кодом?
...
Ну и что это значит?
Я вижу, что книг ты не читаешь, зато продолжаешь нести какую-то чушь (царь\холоп) и размазывать сопли. Всё, я умываю руки, далее без меня.
Название: Re: Изучаем C#
Отправлено: Пашин Евгений от 31-08-2015, 12:17:38
Т.е. кнопку "цитировать выделенное" ты нажимал не там где нужно.

Приношу свои извинения.
Название: Re: Изучаем C#
Отправлено: Дмитрий Загорулькин от 01-09-2015, 00:43:08
Я вспоминаю как я относительно недавно (года 2 тому назад) начинал изучать C#. Он и правда не очень прост в изучении, если раньше вообще с ООП не имел дела. Книги написаны теми, кто уже его знает, для кого все понятия уже очевидны. Поэтому, по книгам мне лично было очень тяжело изучать. Я читал и перечитывал отдельные главы по нескольку раз и абсолютно ничего не мог понять. Интерфейсы, поля, свойства, индексаторы, абстрактные классы, виртуальные методы, статические и нестатические классы - голова от этого только болела :). Даже с примерами понятнее не становилось. При этом, я уже довольно сносно на тот момент писал на LISP. И поначалу я на C#  писал LISP-подобные программы с одним командным классом и с одним длиннющим методом в нем :) А понимание пришло с опытом. Постепенно, с каждым новым кодом узнавал и понимал что-то новое. Потом, уже с небольшим багажом опыта снова начинал читать книги, понимал уже гораздо больше. Кое-что просто запоминал "как есть", не понимая, а понимание приходило позже, когда разбирал чей-то чужой код с нужным мне методом или классом...
В общем, пройдя уже через это, я понимаю, что гораздо легче и продуктивнее было бы, если бы я пошел на какие-то курсы по программированию. Они как раз ориентированны на начинающих. Если есть такая возможность - не пренебрегайте ею. Ну или по тому же пути, что шел я - методом проб и ошибок. Но так дольше и будет много пробелов в базовых знаниях, которые долго придется самому закрывать. А терроризировать кого-то из опытных, просить разъяснить - это пустая трата времени. В большинстве случаев, разъяснение будет на том же профессиональном языке, на котором книга написана. Мало кто готов тратить свое время (бесплатно) на подробное и обстоятельное разжевывание базовых понятий.
Название: Re: Изучаем C#
Отправлено: Пашин Евгений от 01-09-2015, 06:50:06
Я читал и перечитывал отдельные главы по нескольку раз и абсолютно ничего не мог понять.

Как я Вас понимаю. Пока так и есть.

Мало кто готов тратить свое время (бесплатно) на подробное и обстоятельное разжевывание базовых понятий.

От этого меня и коробит, что своими вопросами я кого-то отвлекаю от важных дел (как если бы меня отвлекали, когда дел невпроворот). Я все это прекрасно понимаю. Поэтому постараюсь вообще не задавать вопросов, если не готов к ответам. Теперь буду разбираться в примерах - это пока единственный путь для меня, чем я и занимаюсь уже.
Название: Re: Изучаем C#
Отправлено: Владимир Шу от 01-09-2015, 09:12:00
Нда, я в программирование без года неделю, однако представляю КАК должно коробить Александра Ривилиса и уж тем более Андрея от того что опубликовано в сообщении 29.

Евгений, обрабатывайте возможные ошибки и удаляйте только свое и еще, это НЕ vb.net, это vba.
Название: Re: Изучаем C#
Отправлено: Пашин Евгений от 01-09-2015, 09:21:25
это НЕ vb.net, это vba.

Я пишу в Visual Studio используя NET библиотеки и COM объект (вернее то, что наследует COM объект)... Вы меня в ступор ввели. На чистом VBA этого я бы не смог сделать никогда.
Да, я использую COM методы, но назвать это чистым VBA как-то язык не поворачивается.

На мой взгляд, COM - это пожалуй единственная зацепка, для того чтобы плавно перейти от чистого VBA/ActiveX к чистому NET (VB или C#).

Может Александр поправит, если я что-то не так написал?!
Название: Re: Изучаем C#
Отправлено: Александр Ривилис от 01-09-2015, 10:12:43
и еще, это НЕ vb.net, это vba.
VBA - это язык программирования. А то, что здесь - это COM/ActiveX.
На мой взгляд, COM - это пожалуй единственная зацепка, для того чтобы плавно перейти от чистого VBA/ActiveX к чистому NET (VB или C#).

Может Александр поправит, если я что-то не так написал?!
Резать к чёртовой матери, не дожидаясь перитонитов! (https://www.youtube.com/watch?v=j2br_GaH7B8)
Т.е. забыть про то, как это было в VBA и сразу использовать то, что есть в AutoCAD .NET API. Иначе к  AutoCAD .NET API ты не перейдёшь никогда.
Название: Re: Изучаем C#
Отправлено: Пашин Евгений от 01-09-2015, 10:24:34
Резать к чёртовой матери, не дожидаясь перитонитов!

Эх, классика )))

Иначе к  AutoCAD .NET API ты не перейдёшь никогда.

Перейду, вот увидите. И еще Вам помогать отвечать на вопросы спрашивающих буду.
Название: Re: Изучаем C#
Отправлено: Александр Ривилис от 01-09-2015, 10:26:13
Перейду, вот увидите. И еще Вам помогать отвечать на вопросы спрашивающих буду.
Договорились! Этот боевой настрой мне нравится. :)
Название: Re: Изучаем C#
Отправлено: Александр Ривилис от 01-09-2015, 10:30:18
            ' Получение редактора текущего документа (напрашивается вопрос: что под редактором текущего документа подразумевается)
В действительности он один для всех документов. В ObjectARX это класс AcEditor, имеющий единственный экземпляр для всех документов. А вот в AutoCAD .NET API почему-то сделали получение объекта Editor через документ. Реально же это один и тот же объект для всех документов.
Название: Re: Изучаем C#
Отправлено: Пашин Евгений от 01-09-2015, 10:35:43
Спасибо, за прояснение вопроса )

Реально же это один и тот же объект для всех документов.

Для всех чертежей во всех открытых приложениях AutoCAD? Или только для текущего приложения?
Название: Re: Изучаем C#
Отправлено: Александр Ривилис от 01-09-2015, 10:38:27
Для всех чертежей во всех открытых приложениях AutoCAD? Или только для текущего приложения?
Только для текущего приложения.
Название: Re: Изучаем C#
Отправлено: Пашин Евгений от 01-09-2015, 10:39:46
Спасибо!  :)
Название: Re: Изучаем C#
Отправлено: Пашин Евгений от 01-09-2015, 11:18:01
Александр Ривилис, подскажите, а Вы могли бы создать раздел по терминологии AutoCAD NET, в котором можно было бы иметь полный перечень терминов и понятий, который принадлежит данной теме, чтобы люди друг друга могли понимать одинаково, а то я прогуливаюсь по различным форумам, источникам и что я вижу: везде разная терминология и понятия, что существенно снижает скорость восприятия материала и процесс решения задачи. У кого-то SelectionSet - называется выборкой, у кого-то создание массива объектов и так далее (это еще не самый плохой термин, что я видел)... и ведь люди так и пишут в комментариях к коду, а я потом гадаю, что они имели ввиду. А может я не один такой. Идея вроде как не слишком плохая.
Название: Re: Изучаем C#
Отправлено: Владимир Шу от 01-09-2015, 11:32:25
VBA - это язык программирования. А то, что здесь - это COM/ActiveX.
Видимо я не достаточно правильно выразился. Я не про ЯП писал и не про методы работы с автокадом. Я имел ввиду то, как написан код, какие конструкции языка были использованы.
Для примера, использование переменной типа long при итерации по наборам выборки и его не явного приведения к инту, про удаление всех выборок какие только есть, без разбора, про неявные преобразования из типа в тип. К сожалению это характерно для программирования в VBA-стиле. Потому это VBA (в плохом смысле этого слова), а не COM/ActiveX написанный на VB.NET
Название: Re: Изучаем C#
Отправлено: Александр Ривилис от 01-09-2015, 11:51:16
Идея вроде как не слишком плохая
Идея неплохая, но объём работы для меня неподъёмный. Лучше я буду тратить время на помощь программистам, чем заниматься терминологией. Да и проще и реальнее купить книгу. Например, Н.Н.Полещук. "Программирование для AutoCAD 2013-2015". ДМК Пресс, 2015 (http://adn-cis.org/forum/index.php?topic=1097.msg5350#msg5350)
У Николая Николаевича устоявшаяся за много лет терминология. Вот её я и рекомендую придерживаться.
Название: Re: Изучаем C#
Отправлено: Пашин Евгений от 01-09-2015, 11:58:14
У Николая Николаевича устоявшаяся за много лет терминология. Вот её я и рекомендую придерживаться.

Согласен :)
Название: Re: Изучаем C#
Отправлено: Пашин Евгений от 01-09-2015, 12:12:30
К сожалению это характерно для программирования в VBA-стиле. Потому это VBA (в плохом смысле этого слова), а не COM/ActiveX написанный на VB.NET

Вы не сильно удивитесь, если я скажу, что я начинал с VB6. Отсюда и старые подходы ))) VBA для меня - это прикладной язык программирования для решения конкретных задач под различные приложения. К примеру я до сих пор пишу на VBA под Microsoft Office (Word, Excel, Visio, Acces, Outlook), а также Corel Draw, ну и конечно же AutoCAD. Иногда приходится работать с SolidEdge и SolidWorks. Увы, мне слезть с него не получится полностью. Поэтому Вы не сильно ошиблись, язык VB.NET, а подход к программированию VB6 (даже не VBA). Я это понимаю.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Дима_ от 02-09-2015, 20:51:47
Александр Ривилис - разместил пост здесь т.к. можно офтопить - если это перебор то перенесите куда-нибудь или сотрите.
Это для вдохновения нашему топикстартеру - бывают и такие случаи.
Реальный пост с dwg.ru http://forum.dwg.ru/showpost.php?p=1444353&postcount=13 (http://forum.dwg.ru/showpost.php?p=1444353&postcount=13)
Цитировать
Разговор со службой поддержки хостинга:
09:42:05 Дмитрий Пшеченко: Здравствуйте! Чем я могу вам помочь?
09:46:35 я: здравствуйте. У меня на сайте размещен некоторый скрипт php, и когда моя программа, запущеная на моем локальном компе обращается к этому скрипту - он начинает выполняться. Я попробовал написать аналогичный скрипт на языке autolisp. поместил его на сайт. Прога к нему обращается, но в ответ лишь получает текстовое содержимое этого скрипта, так, как если бы у этого файла со скриптом было бы разрешение file.txt. то есть код не выполняется
09:47:53 Дмитрий Пшеченко: В какой паке находится скрипт?
09:49:09 я: указал папку

файл со скриптом называется siteee.lsp
09:53:47 Дмитрий Пшеченко: Скорее всего, этот скрипт не запустится.
09:53:55 Дмитрий Пшеченко: Минуту, дополнительно проверю.
09:54:54 Дмитрий Пшеченко: Не будет работать точно на хостинге.
09:55:57 я: а почему?
09:56:55 Дмитрий Пшеченко: Этот язык не предназначен для веб-разработок.
10:00:04 я: простите, а можно список языков, скрипты на которых будут работать?
10:00:52 Дмитрий Пшеченко: Такого списка у меня нет. Тут можете посмотреть базовую информацию: https://ru.wikipedia.org/wiki/%D0%92...BD%D0%B8%D0%B5
Вот такие они web-autolisp программисты.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Ривилис от 02-09-2015, 20:59:51
Вот такие они web-autolisp программисты.
:D :D :D
Название: Re: Оффтопик. Изучаем C#
Отправлено: Дима_ от 13-09-2015, 23:18:10
Всех - и кто еще только учится и тех кто учит, кто больше задает вопросы и кто больше отвечает, кто написал все правильно и тех кто потом исправлял - с Праздником.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Алексей Кулик от 13-09-2015, 23:19:18
С каким праздником?
Название: Re: Оффтопик. Изучаем C#
Отправлено: Дима_ от 13-09-2015, 23:22:32
Семен Семеныч - 256 день в году однако.
Название: Re: Оффтопик. Изучаем C#
Отправлено: art_rrc от 25-10-2015, 00:28:44
Раз уж здесь разрешен флуд, и в предпросмотре не показываются вложения. Решил тут проверить как прикрепляются GIFки. Нужно для дальнейшего более четкого формирования вопросов... ::)

О! Результат отличный. И вообще, форум что надо!
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Ривилис от 25-10-2015, 00:34:26
Раз уж здесь разрешен флуд
Только если перейдёшь с VB.NET на C# !!!  :D
Название: Re: Оффтопик. Изучаем C#
Отправлено: art_rrc от 25-10-2015, 00:39:16
Только если перейдёшь с VB.NET на C# !!! 
Перейду, обязательно перейду. Но не все же сразу...) Пока и так слишком много вопросов, которые не связаны с выбором языка. С ними немного разгребусь и тогда  ай-да изучать новый синтаксис.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Agens от 30-10-2015, 17:56:36
А что-то не могу осилить C#. Чего-то не хватает: времени или мозгов :)
Название: Re: Оффтопик. Изучаем C#
Отправлено: Алексей Кулик от 30-10-2015, 20:14:04
Скорее, желания и внятной задачи небольшого объема :)
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Пекшев aka Modis от 03-11-2015, 09:13:39
А что-то не могу осилить C#. Чего-то не хватает: времени или мозгов :)
Алексей Кулик прав - нужна именно четко поставленная задача. Когда будешь знать что хочешь увидеть в итоге, тогда начнешь потихоньку делать, искать нужную информацию и вникать в суть происходящего. Обычно находишь уже готовый пример и начинаешь в нем разбираться. Благо сейчас доступ к интернету есть почти везде
Название: Re: Оффтопик. Изучаем C#
Отправлено: Agens от 03-11-2015, 21:19:11
кто может дать ссылку на русскоязычный источник, дабы почитать про транзакцию и работу с базами. У меня в этом деле проблема :)
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Пекшев aka Modis от 03-11-2015, 22:25:38
кто может дать ссылку на русскоязычный источник, дабы почитать про транзакцию и работу с базами. У меня в этом деле проблема :)
Тынц (http://bushman-andrey.blogspot.ru/2013/01/database-autocad.html)
Название: Re: Оффтопик. Изучаем C#
Отправлено: avc от 14-02-2016, 20:13:53
Не стану поднимать отдельную тему т.к. вопрос по C#, а не Автокаду. Как заблокировать назойливое предупреждение компилятора "Несоответствие между архитектурой процессора проекта "MSIL", построение которого выполняется, и архитектурой процессора ссылки "accoremgd", "AMD64". По сути все понятно: компилирую для AnyCPU, а у автокада библиотеки для amd64. Можно смело игнорировать. НО! Оно выводится для каждой ссылки каждого проекта и в этом мусоре реальные проблемы теряются. И нигде не найду, как отключить предупреждение не зная его номера и еще на уровне всего проекта, а не файла.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Ривилис от 14-02-2016, 20:19:44
avc
Откуда берёшь acmgd.dll, accoremgd.dll и acdbmgd.dll? Если брать их из ObjectARX\inc, то таких сообщений нет.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Алексей Кулик от 14-02-2016, 20:44:45
Дополнительный вопрос - под какую версию AutoCAD выполняется компиляция? При условии компиляции под 2009, например, подобные сообщения не редкость.
P.S. Возможно, надо поменять уровень предупреждений. Но я в этом не уверен.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Ривилис от 14-02-2016, 20:49:43
Дополнительный вопрос - под какую версию AutoCAD выполняется компиляция? При условии компиляции под 2009, например, подобные сообщения не редкость.
Так как в вопросе фигурирует accoremgd.dll, то версия не ниже 2013 (в ней произошло разделение acmgd.dll на accoremgd.dll и acmgd.dll). Общие (независящие от разрядности AutoCAD) acmgd.dll и acdbmgd.dll появились в ObjectARX SDK 2011.
Название: Re: Оффтопик. Изучаем C#
Отправлено: avc от 15-02-2016, 00:04:42
Ссылался конечно на библиотеки из папки автокада, где отладка идет. Как-то даже в голову не пришло, что ObjectARX(который весь на C++) может пригодится для компиляции C#. Поменял ссылки, предупреждение исчезло. Чудеса. Получается там (в inc) не же самая dll, что в автокаде.
Спасибо.
p.s. Жаль, что так и не научился отключать предупреждения компилятора :)
p.p.s А предупреждение-то было во всех версиях с незапамятных времен, когда из автокада изъяли бейсик и пришлось переучиваться на дот-нет. Да, я долго терпел. Я вообще терпеливый :)
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Ривилис от 15-02-2016, 00:12:11
Получается там (в inc) не же самая dll, что в автокаде.
Нет конечно. Там так называемая "заглушка", т.е. большинство методов не реализованы в отличие от методов в dll в составе AutoCAD. Это и позволяет использовать одну и туже dll для x86 и для x64, хотя в составе AutoCAD они разные, т.к. "привязаны" к самому AutoCAD (acad.exe, acdbXX.dll и т.д.)
p.s. Жаль, что так и не научился отключать предупреждения компилятора :)
Почитай тут: http://thebuildingcoder.typepad.com/blog/2013/06/processor-architecture-mismatch-warning.html
Если в двух словах, то такую конструкцию нужно добавить в файл проекта (.csproj или .vbproj):
Код - XML [Выбрать]
  1. <PropertyGroup>
  2.   <ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
  3.     None
  4.   </ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
  5. </PropertyGroup>
Я не пробовал, но теоретически должно помочь.
Название: Re: Оффтопик. Изучаем C#
Отправлено: avc от 15-02-2016, 12:32:06
Я не пробовал, но теоретически должно помочь.
Попробовал. Помогает! На мой взгляд это оптимальное решение. Универсальное и не требуется поиск и загрузка огромных ненужных библиотек.
Спасибо!
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Ривилис от 15-02-2016, 14:31:18
не требуется поиск и загрузка огромных ненужных библиотек.
Огромные и ненужные библиотеки, это ObjectARX SDK? Ну-ну... Там большую часть занимает документация, которая совсем не бесполезная.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Дмитрий Загорулькин от 15-02-2016, 17:17:55
А предупреждение-то было во всех версиях с незапамятных времен, когда из автокада изъяли бейсик и пришлось переучиваться на дот-нет. Да, я долго терпел
Ну не знаю, что в этом такого критичного. Мешают - скрыл, да и все:
Название: Re: Оффтопик. Изучаем C#
Отправлено: Мурена от 06-12-2017, 19:01:51
Здравствуйте!
Студия подчёркивает волнистой синей линией конструктор. При наведении мышкой подписывает "Method must have a return type". В чём может быть причина?
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Пекшев aka Modis от 06-12-2017, 19:05:05
Здравствуйте!
Студия подчёркивает волнистой синей линией конструктор. При наведении мышкой подписывает "Method must have a return type". В чём может быть причина?
Так вы код покажите. Сигнатуру метода
А написано, что метод должен иметь возвращаемый тип
Название: Re: Оффтопик. Изучаем C#
Отправлено: Мурена от 06-12-2017, 19:07:50
конструктор должен иметь возвращаемый тип?
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Пекшев aka Modis от 06-12-2017, 19:10:23
конструктор должен иметь возвращаемый тип?
Метод должен иметь возвращаемы тип. Void - единственный вариант, который не возвращает ничего
Конструктор НЕ должен иметь возвращаемый тип! Метод не может иметь конструктора в принципе )) Это для классов
Название: Re: Оффтопик. Изучаем C#
Отправлено: Мурена от 06-12-2017, 19:14:21
(https://s2.postimg.org/evv38misl/image.jpg) (https://postimg.org/image/evv38misl/)
Я конструктор класса и пытаюсь написать
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Пекшев aka Modis от 06-12-2017, 19:22:20
Странно. А покажите класс, от которого наследуетесь - BaseArmElement
Название: Re: Оффтопик. Изучаем C#
Отправлено: Мурена от 06-12-2017, 19:27:57

(https://s2.postimg.org/6298oi4ol/image.jpg) (https://postimg.org/image/6298oi4ol/)
Название: Re: Оффтопик. Изучаем C#
Отправлено: Дмитрий Загорулькин от 06-12-2017, 19:30:33
1. Название класса и конструктора не совпадает. Попробуйте копипастом взять название класса. Может русский символ где-то затесался.
2. Глюк студии. Попробуйте её заново открыть
Название: Re: Оффтопик. Изучаем C#
Отправлено: Мурена от 06-12-2017, 19:34:04
1. Название класса и конструктора не совпадает. Попробуйте копипастом взять название класса. Может русский символ где-то затесался.
Название скопировано.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Мурена от 06-12-2017, 19:34:28
2. Глюк студии. Попробуйте её заново открыть
Помогло, Спасибо!
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Ривилис от 06-12-2017, 19:37:54
Помогло, Спасибо!
Такое бывает достаточно часто. То, что подчеркивается какие-то методы/переменные в редакторе VS - это еще не показатель ошибки. Вот если вы скомпилировали и появилась ошибка в компиляции - это уже точно ошибка и её следует найти и устранить.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Мурена от 12-12-2017, 14:37:29
Здравствуйте, подскажите, пожалуйста, в С# есть аналог оператора with в VB?
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Пекшев aka Modis от 12-12-2017, 14:39:59
Здравствуйте, подскажите, пожалуйста, в С# есть аналог оператора with в VB?
Нет
Название: Re: Оффтопик. Изучаем C#
Отправлено: Дмитрий Загорулькин от 12-12-2017, 14:42:42
в С# есть аналог оператора with в VB?
Насколько я знаю, прямого аналога нет. Разве что, есть похожий механизм - упрощённый инициализатор объекта или коллекции. Доступен в C# версии 7: https://docs.microsoft.com/ru-ru/dotnet/csharp/programming-guide/classes-and-structs/object-and-collection-initializers. Но это только при создании объекта или коллекции.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Пекшев aka Modis от 12-12-2017, 14:44:18
Мурена, а вообще - смотря для чего вам. Если инициализировать поля для экземпляра класса, то есть специальный инициализатор объектов. Типа того:
Код - C# [Выбрать]
  1. public class Bunny
  2. {
  3.     public string Name;
  4. }
  5.  
  6. var bunny = new Bunny { Name = "Bugs" };
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Пекшев aka Modis от 12-12-2017, 14:46:01
Доступен в C# версии 7
Джозеф Албахари говорит, что доступен с версии C# 3.0
Название: Re: Оффтопик. Изучаем C#
Отправлено: Дмитрий Загорулькин от 12-12-2017, 14:50:22
Да, уже исправился :)
Просто в студии 2017 появились настойчивые подсказки везде использовать именно такую инициализацию, вот я и подумал, что это новшество 7-й версии.
Настолько настойчивые, что мне даже приходится в настройках отключать такие предупреждения:
(https://s8.postimg.org/o83jueoyp/Sup_War.png) (https://postimg.org/image/o83jueoyp/)
Название: Re: Оффтопик. Изучаем C#
Отправлено: Мурена от 12-12-2017, 15:05:16
смотря для чего вам
Для инициализации полей структуры, но через инициализатор , наверно, не подойдет, так как требуются проверки допустимости значений, введенных пользователем
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Пекшев aka Modis от 12-12-2017, 15:20:50
смотря для чего вам
Для инициализации полей структуры, но через инициализатор , наверно, не подойдет, так как требуются проверки допустимости значений, введенных пользователем
Я не пользовался структурами, но немного погуглив понимаю - то что вы хотите - нереализуемо. Используйте класс
Название: Re: Оффтопик. Изучаем C#
Отправлено: Дмитрий Загорулькин от 12-12-2017, 15:25:40
Для инициализации полей структуры, но через инициализатор , наверно, не подойдет, так как требуются проверки допустимости значений, введенных пользователем
но немного погуглив понимаю
А я совершенно не понимаю: при чём тут проверка значений и инициализация полей структуры? Проверка значений может выполняться сразу после их ввода, ещё до каких-то инициализаций. Структура, также, может содержать метод проверки своих внутренних значений на корректность. Если Александр понял о чём Вы, то ему полагается орден Ванги 1-й степени :)
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Пекшев aka Modis от 12-12-2017, 15:32:19
Структура, также, может содержать метод проверки своих внутренних значений на корректность
Я сначала попробовал и у меня не получилось. Студия сразу заругалась)
Для структуры можно задать только конструктор с параметрами и при этом имена параметров должны полностью повторять имена полей в структуре. Проверку введенных данных можно сделать, но обязательно так, чтобы поле в любом случае получило значение
Код - C# [Выбрать]
  1. struct Book
  2. {
  3.     public string name;
  4.     public string author;
  5.     public int year;
  6.  
  7.     public Book(string name, string author, int year)
  8.     {
  9.         this.name = name;
  10.         this.author = author;
  11.         if (year < 3000)
  12.             this.year = year;
  13.         else this.year = 3000;
  14.     }
  15.  
  16.     public void Info()
  17.     {
  18.         Console.WriteLine($"Книга '{name}' (автор {author}) была издана в {year} году");
  19.     }
  20. }
Название: Re: Оффтопик. Изучаем C#
Отправлено: Мурена от 12-12-2017, 15:36:51
Проверка значений может выполняться сразу после их ввода, ещё до каких-то инициализаций
Да, точно, я торможу. Спасибо.
Для структуры можно задать только конструктор с параметрами
Конструктор использовать не хочу именно потому, что туда надо передавать кучу параметров.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Дмитрий Загорулькин от 12-12-2017, 15:40:23
Для структуры можно задать только конструктор с параметрами
Да, это так. Т.к. конструктор без параметров у неё всегда есть "по умолчанию".
и при этом имена параметров должны полностью повторять имена полей в структуре
А вот это не верно. В конструкторе должны задаваться значения всех полей, но это никак не связано с составом и именами параметров.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Пекшев aka Modis от 12-12-2017, 15:44:56
А вот это не верно.
Да, наврал. Но у меня студия ругалась, когда я пробовал. И теперь не знаю на что... Ну в общем - хрен с ней) С вопросом разобрались
Название: Re: Оффтопик. Изучаем C#
Отправлено: Мурена от 19-12-2017, 15:18:32
Здравствуйте!
Пытаюсь перейти на C# после VBA, не понятен такой момент:  в VBA можно было писать много модулей, взаимодействующих между собой, в результате компиляции получался один dvb файл. А на C# каждый файл .cs компилируется в свою сборку? Если я хочу разнести программу на логические части, как правильно сделать: делать многофайловую сборку из нескольких .cs файлов или есть какой то ещё вариант?
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Пекшев aka Modis от 19-12-2017, 15:22:06
Здравствуйте!
Пытаюсь перейти на C# после VBA, не понятен такой момент:  в VBA можно было писать много модулей, взаимодействующих между собой, в результате компиляции получался один dvb файл. А на C# каждый файл .cs компилируется в свою сборку? Если я хочу разнести программу на логические части, как правильно сделать: делать многофайловую сборку из нескольких .cs файлов или есть какой то ещё вариант?
Что-то страшное вы рассказываете)
Если вы используете Visual Studio, то просто создаете проект, в свойствах которого ставите "библиотека классов", добавляете столько cs файлов, сколько вам нужно и компилируете - на выходе получите одну dll
Название: Re: Оффтопик. Изучаем C#
Отправлено: Мурена от 19-12-2017, 15:26:30
проект, в свойствах которого ставите "библиотека классов"
А если стоит "консоль", тогда каждый добавленный .cs файл в свою сборку компилируется?
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Пекшев aka Modis от 19-12-2017, 15:27:07
проект, в свойствах которого ставите "библиотека классов"
А если стоит "консоль", тогда каждый добавленный .cs файл в свою сборку компилируется?
Нет. Проект всегда компилируется во что-то одно
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Ривилис от 19-12-2017, 15:29:44
А на C# каждый файл .cs компилируется в свою сборку?
Расскажите как это Вам удалось.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Мурена от 19-12-2017, 15:32:09
Проект всегда компилируется во что-то одно
У меня есть классы объявленные в файлах без модификатора доступа , вроде они по умолчанию должны быть internal, и студия по началу вроде не ругается и ничего не подчёркивает, а компилировать не хочет, только с public'ом получается. Вот я и подумала, что может студия видит файлы как разные сборки...
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Ривилис от 19-12-2017, 15:32:29
А если стоит "консоль", тогда каждый добавленный .cs файл в свою сборку компилируется?
Не рекомендую использовать консоль. У него есть своя специфика, которая может привести к проблемам с AutoCAD .NET API.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Мурена от 19-12-2017, 15:33:10
Расскажите как это Вам удалось
Я может что-то не то сказала, только начинаю знакомиться с С#
Название: Re: Оффтопик. Изучаем C#
Отправлено: Мурена от 19-12-2017, 15:33:59
Не рекомендую использовать консоль
Использую в целях "быстрого старта" так сказать. Потом, конечно, сделаю по нормальному в виде приложения
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Ривилис от 19-12-2017, 15:35:08
вроде они по умолчанию должны быть internal
Не internal, а private - поэтому из других классов и не видны.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Мурена от 21-12-2017, 08:08:26
Здравствуйте! Подскажите, пожалуйста, в операторе Swith Case нельзя применять в качестве селектора переменные выражения целого типа (значение заранее неизвестно)?
Название: Re: Оффтопик. Изучаем C#
Отправлено: trir от 21-12-2017, 10:33:27
низя
Цитировать
switch ( expression ) 
   case constant-expression : statement 
   [default  : statement]
как то вы сильно замудрили...

вместо Swith Case можно использовать словарь (Dictionary<int, Delegate>) - Python-Style!
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Пекшев aka Modis от 21-12-2017, 11:06:28
вместо Swith Case можно использовать словарь (Dictionary<int, Delegate>) - Python-Style!
А чем if() не устраивает?
Название: Re: Оффтопик. Изучаем C#
Отправлено: trir от 21-12-2017, 11:13:36
Цитировать
А чем if() не устраивает?
не хочится длиную портянку использовать
Название: Re: Оффтопик. Изучаем C#
Отправлено: Мурена от 21-12-2017, 11:16:33
вместо Swith Case можно использовать словарь (Dictionary<int, Delegate>)
Мне вот только не понятно, как...
У меня в общем цикл, количество итераций count зависит от ввода пользователя. В теле для каждого элемента выполняется стандартный алгоритм один и тот же, только для первого и последнего элемента (он же count) есть дополнительные действия. Если использовать If, то часть кода (стандартный алгоритм) придётся повторно писать, чего не хотелось бы. В VBA такой проблемы не было
В принципе, в ветке default, можно попробовать один if дописать
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Пекшев aka Modis от 21-12-2017, 11:18:07
вместо Swith Case можно использовать словарь (Dictionary<int, Delegate>)
Мне вот только не понятно, как...
У меня в общем цикл, количество итераций count зависит от ввода пользователя. В теле для каждого элемента выполняется стандартный алгоритм один и тот же, только для первого и последнего элемента (он же count) есть дополнительные действия. Если использовать If, то часть кода (стандартный алгоритм) придётся повторно писать, чего не хотелось бы. В VBA такой проблемы не было
Для count можно использовать case switch
Название: Re: Оффтопик. Изучаем C#
Отправлено: trir от 21-12-2017, 11:18:23
Цитировать
Если использовать If, то часть кода (стандартный алгоритм) придётся повторно писать
так ты его в отдельную функию вынеси

Цитировать
Для count можно использовать case switch
нельзя, получишь "constant value is expected" (https://docs.microsoft.com/en-us/dotnet/csharp/misc/cs0150)
Название: Re: Оффтопик. Изучаем C#
Отправлено: Мурена от 21-12-2017, 11:27:18
нельзя, получишь "constant value is expected"
Да, именно это я и получаю
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Пекшев aka Modis от 21-12-2017, 11:35:52
Без примера кода сложно рассуждать
Название: Re: Оффтопик. Изучаем C#
Отправлено: Мурена от 22-12-2017, 21:22:41
Здравствуйте!
Встал вопрос о сохранении объектов в контейнер. Смотрю в сторону использования хеш-таблицы. В качестве ключа планируется использовать структуры с большим количеством полей разных простейших типов (не ссылочных). Как пишут, надо переопределять методы GetHashCode и Equals. Подскажите, пожалуйста, если ключом является структура , надо ли переопределять? если надо, то нормальным ли будет вариант получить конкатенацию из строковых представлений всех полей, или может кто ещё что посоветует. А может и вообще использовать что-то другое в качестве хранилища?
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Ривилис от 23-12-2017, 14:40:14
В качестве ключа планируется использовать структуры с большим количеством полей разных простейших типов (не ссылочных).
Ключа или данных?
Название: Re: Оффтопик. Изучаем C#
Отправлено: Мурена от 23-12-2017, 14:47:33
Ключа или данных?
ДА. Так можно? ли это не лучший вариант
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Ривилис от 23-12-2017, 14:58:37
Ключа или данных?
ДА. Так можно? ли это не лучший вариант
Если честно, то мне не приходилось видеть, чтобы в качестве ключа использовали сложную структуру. Обычно ключ это что-то простое (адрес, число, строка, ObjectId), а вот значение может быть сложной структурой/экземпляром класса.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Мурена от 23-12-2017, 15:06:48
У меня объект создаётся на основе геометрических свойств, которые записаны в структуру; объект должен быть уникальным, поэтому предполагается взять хеш-таблицу в качестве хранилища уже созданных объектов, а по ключу - структуре определять, был ли создан экземпляр с такими геометрическими свойствами. Я просто не программист, не имею специального образования, поэтому сложновато разбираться.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Мурена от 24-12-2017, 14:53:12
Кроме как переопределить метод ToString() структуры (чтобы формировал пары "поле"-значение в строку и в конце сделать конкатенацию строк) и вызвать на результате GetHashCode() класса String , ничего не приходит в голову. Буду пока так пробовать
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Ривилис от 24-12-2017, 16:10:24
Кроме как переопределить метод ToString() структуры (чтобы формировал пары "поле"-значение в строку и в конце сделать конкатенацию строк) и вызвать на результате GetHashCode() класса String , ничего не приходит в голову. Буду пока так пробовать
Я тоже не вижу лучшего пути.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Мурена от 24-12-2017, 16:31:06
А не подскажите ещё: как я поняла, механизм метода Hashtable.Add() вычисляет хеш код ключа и смотрит, если есть уже в таблице такой код, то сам (?) вызывает Equals , сравнивая содержимое объектов? И я недопоняла?
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Ривилис от 24-12-2017, 16:36:57
А не подскажите ещё: как я поняла, механизм метода Hashtable.Add() вычисляет хеш код ключа и смотрит, если есть уже в таблице такой код, то сам (?) вызывает Equals , сравнивая содержимое объектов? И я недопоняла?
https://msdn.microsoft.com/ru-ru/library/system.collections.hashtable.add(v=vs.110).aspx
Если элемент с таким ключом уже есть, то будет исключение ArgumentException. В .NET исключения обрабатываются достаточно медленно. Так что лучше сначала проверить при помощи Hashtable.Contains нет ли еще такого ключа.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Мурена от 24-12-2017, 16:56:36
Если ключ превращать в строку, то проще, наверно, использовать Dictionary<TKey, TValue> . На этом я, наверно , и остановлюсь.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Дмитрий Загорулькин от 25-12-2017, 13:11:45
Структуры могут быть ключом словаря, точно так же, как строка. У них, как и всех других объектов, есть метод Equals, который проверяет, совпадают ли значения полей структуры. Если совпадают - то структуры считаются одинаковыми. Этот метод Equals можно переопределить (если нужно, например, сравнивать не все поля). Также, для удобства сравнения и сортировки значений, можно реализовать интерфейс IComparable<T>.
https://msdn.microsoft.com/ru-ru/library/ms131187(v=vs.110).aspx
Название: Re: Оффтопик. Изучаем C#
Отправлено: Мурена от 27-12-2017, 15:40:47
Здравствуйте!
Подскажите, пожалуйста, если использовать сначала Dictionary.ContainsKey(key), а потом Dictionary.Add(key,value) не происходит ли двойной поиск  ключа в словаре? или Add не проверяет?
Название: Re: Оффтопик. Изучаем C#
Отправлено: Дмитрий Загорулькин от 27-12-2017, 15:46:05
или Add не проверяет?
Add выдаёт исключение, если такой ключ уже есть.
Я в последнее время практически не использую этот метод, как раз из-за того, что нужно сперва проверять наличие ключа. Мне проще так:
Код - C# [Выбрать]
  1. Dictionary<string, int> dict = new Dictionary<string, int>();
  2.  
  3. // Вместо такой конструкции
  4. if (!dict.ContainsKey("item"))
  5. {
  6.     dict.Add("item", 0);
  7. }
  8.  
  9. // Можно написать просто так
  10. dict["item"] = 0;
  11. // Если значение есть, то оно перезапишется. Если нет - создастся новое.
  12. // В большинстве случаев меня такое поведение полностью устраивает
  13.  
Название: Re: Оффтопик. Изучаем C#
Отправлено: Мурена от 27-12-2017, 15:47:52
Мне не надо перезаписывать, а наоборот, если есть , то вернуть , что есть, если нет - то записать
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Ривилис от 27-12-2017, 15:53:30
Мне не надо перезаписывать, а наоборот, если есть , то вернуть , что есть, если нет - то записать
Тогда еще проще:
Код - C# [Выбрать]
  1.     Dictionary<string, int> dict = new Dictionary<string, int>();
  2.      
  3.     if (!dict.ContainsKey("item"))
  4.     {
  5.         dict.Add("item", 0);
  6.     }
  7.      
  8.     return dict["item"];
     
Название: Re: Оффтопик. Изучаем C#
Отправлено: Дмитрий Загорулькин от 27-12-2017, 15:54:26
Ну тогда через ContainsKey и Add - самое разумное. Фактически, да, происходит двойная проверка по коллекции ключей: https://github.com/Microsoft/referencesource/blob/master/mscorlib/system/collections/generic/dictionary.cs
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Ривилис от 27-12-2017, 15:58:36
не происходит ли двойной поиск  ключа в словаре?
Так как коллекция упорядоченная, то поиск происходит очень быстро (не последовательным перебором). Так что об этом можно не беспокоиться.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Мурена от 27-12-2017, 16:05:34
Так как коллекция упорядоченная, то поиск происходит очень быстро (не последовательным перебором). Так что об этом можно не беспокоиться.
Вот тут , пожалуйста, поподробней.
Итак, сравнение ключей всё же происходит дважды.

Но, я, как обычно, что то перемудрила, наверно, и пока у меня так:
Код - C# [Выбрать]
  1. class MyCmparer : EqualityComparer<GeometryClass>
  2.     {
  3.         public override bool Equals(GeometryClass x, GeometryClass y)
  4.         {
  5.             if (x == y) { return true; }
  6.             if (x == null || y == null) { return false; }
  7.             if (x.IdentClass != y.IdentClass) { return false; }
  8.  
  9.             return x.Equals(y);
  10.         }
  11.        
  12.         public override int GetHashCode(GeometryClass source) //Переопределяя иквалс, переопредели и гетхешкод
  13.         {
  14. //тут будет код
  15.         }
  16.  
  17.     }
  18.  
  19.  
  20.     interface IGeometry
  21.     {
  22.     }
  23.  
  24.     abstract class GeometryClass : IGeometry, IEquatable <GeometryClass>
  25.     {
  26.         //данные для построения каркасса СБН
  27.         String identClass; // идентификатор конструкции
  28.         internal String IdentClass { get { return identClass; } }
  29.         internal GeometryClass(String value)
  30.         {
  31.             identClass = value;
  32.         }
  33.         public abstract Boolean IEquatable<GeometryClass>.Equals(GeometryClass other);
  34.        
  35.     }

Идей в том, чтобы передать сравнение экземпляров их классам, где метод Equals переопределён так, как мне надо. Код разрабатывается в данный момент ещё не проверялся
Название: Re: Оффтопик. Изучаем C#
Отправлено: Мурена от 27-12-2017, 16:14:19
Код - C# [Выбрать]
  1. class DataBaseConcreteProducts // хранит ссылки на экземпляры дерева в хештаблицах в общей базе
  2.     {
  3.         //сделать синглтоном
  4.         private static DataBaseConcreteProducts instance; //ссылка на экземпляр , принадлежит сформированному объекту (т.е. при создании экземпляра будет инициализировано поле объекта)
  5.         internal static DataBaseConcreteProducts GetDataBase() //метод для создания единственного объекта
  6.         {
  7.             if (instance != null)
  8.             { instance = new DataBaseConcreteProducts(); }
  9.             return instance;
  10.  
  11.         }
  12.         Dictionary<GeometryClass, Object > dataBase;
  13.         internal Dictionary<GeometryClass, Object> DataBase { get { return dataBase; } }
  14.  
  15.         internal void Add(GeometryClass key, Object product)
  16.         {
  17.             if (dataBase.ContainsKey(key)) { return dataBase[key]; }
  18.             else { dataBase.Add(key, product); }
  19.         }
  20.         internal Boolean Remove(GeometryClass key)
  21.         {
  22.             if (key != null || dataBase.ContainsKey(key)) { dataBase.Remove(key); return true; }
  23.             else { return false; }
  24.         }
  25.  
  26.         protected DataBaseConcreteProducts() //защищённый конструктор
  27.         {
  28.             dataBase = new Dictionary<GeometryClass , Object >();
  29.         }
  30.     }
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Ривилис от 27-12-2017, 16:15:06
Мурена
Про правильное форматирование у нас на форуме смотрите у меня в подписи.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Мурена от 27-12-2017, 16:17:09
Александр Ривилис,
Да, спасибо!
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Ривилис от 27-12-2017, 16:18:51
Вот тут совершенно неправильно:
Код - C# [Выбрать]
  1. internal void Add(GeometryClass key, Object product)
  2.         {
  3.             if (dataBase.ContainsKey(key)) { return dataBase[key]; }
  4.             else { dataBase.Add(key, product); }
  5.         }
Разберитесь в типе возвращаемого значения.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Мурена от 27-12-2017, 16:25:15
Да, вижу, вот думаю, что надо изменить, чтобы два раза не выполнялась проверка ключа, а тип возвращаемого значения тоже обдумывается. Вроде не особо хорошо писать у Add какой то тип возвращаемого параметра, может поменять название метода на что то типа GetObject, но вроде возвращать ссылку на то, что посылаю как параметр тоже не особо.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Ривилис от 27-12-2017, 16:29:19
что надо изменить, чтобы два раза не выполнялась проверка ключа
Не обращайте внимания. В крайнем случае используйте SortedDictionary<> вместо Dictionary<>
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Ривилис от 27-12-2017, 16:37:35
Есть еще метод TryGetValue:   
Код - C# [Выбрать]
  1. internal Object GetOrAdd(GeometryClass key, Object product)
  2. {
  3.        object val = null;
  4.        if (dataBase.TryGetValue(key, out val)) {
  5.           return val;
  6.       } else {
  7.           return (dataBase[key] = product);
  8.       }
  9. }
Код не проверял, но идея должна быть понятна.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Мурена от 28-12-2017, 00:35:52
Александр Ривилис,
Спасибо, немного видоизменила, это то, что нужно
Название: Re: Оффтопик. Изучаем C#
Отправлено: Atomohod от 25-05-2018, 19:55:58
Здравствуйте!
Не срабатывает установка размеров из списка в зависимости от пользовательского ввода через if else. В чем я неправ?
Код - C# [Выбрать]
  1. public class FormatsHandler
  2.    {
  3.         static double height;
  4.         static double width;
  5.  
  6.         static List<Format> listOfFormats = new List<Format>()
  7.       {
  8.       new Format(){ formatID="A4", height=297, width=210},// все в портретной ориентации
  9.       new Format(){ formatID="A3", height=420, width=297},
  10.       new Format(){ formatID="A2", height=594, width=420},
  11.       new Format(){ formatID="A1", height=841, width=594},
  12.       new Format(){ formatID="A0", height=1189, width=841}
  13.       };
  14.  
  15.         //Points of inner frame
  16.         Point2d keyPoint1 = new Point2d(-width + 25, height - 10);
  17.         Point2d keyPoint2 = new Point2d(0, height - 10);
  18.         Point2d keyPoint3 = new Point2d(0, 0);
  19.         Point2d keyPoint4 = new Point2d(-width + 25, 0);
  20.         //Points of outer frame
  21.         Point2d frPoint1 = new Point2d(-width + 5, height - 5);
  22.         Point2d frPoint2 = new Point2d(5, height - 5);
  23.         Point2d frPoint3 = new Point2d(5, -5);
  24.         Point2d frPoint4 = new Point2d(-width + 5, -5);
  25.  
  26.  
  27.         [CommandMethod("2Insert title")]
  28.  
  29.         public static void DrawTitles()
  30.         {
  31.             Format curFormat = GetDataFromUser();
  32.  
  33.  
  34.             if (curFormat.formatID == "A3" && curFormat.orientation == "Portrait" && curFormat.type == "Title")
  35.             {
  36.                 height = listOfFormats[1].height;
  37.                 width = listOfFormats[1].width;
  38.             }
  39.             else if(curFormat.formatID == "A3" && curFormat.orientation == "Landscape" && curFormat.type == "Title")
  40.             {
  41.                 height = listOfFormats[1].width;
  42.                 width = listOfFormats[1].height;
  43.             }
  44.  
  45. //                else if (curFormat.formatID == "A2" && curFormat.orientation == "Portrait" && curFormat.type == "Title")
  46. //                {
  47. //                height = listOfFormats[2].height;
  48. //                width = listOfFormats[2].width;
  49. //                }
  50. //else
  51. //            {
  52. //                height = listOfFormats[2].width;
  53. //                width = listOfFormats[2].height;
  54. //            }
  55.  
  56.  
  57.            
  58.  
  59.  
  60.  
  61.             FormatsHandler fh = new FormatsHandler();
  62.             fh.DrawMainTitle();
  63.  
  64.         }
  65.  
  66.         public static Format GetDataFromUser()
  67.         {
  68.             Document acDoc = Application.DocumentManager.MdiActiveDocument;
  69.  
  70.             //Выбрать формат
  71.             PromptKeywordOptions chFormat = new PromptKeywordOptions("\nChoose format: ");
  72.  
  73.             chFormat.Keywords.Add("A4");
  74.             chFormat.Keywords.Add("A3");
  75.             chFormat.Keywords.Add("A2");
  76.             chFormat.Keywords.Add("A1");
  77.             chFormat.Keywords.Add("A0");
  78.             chFormat.AllowNone = false;
  79.  
  80.             PromptResult formatID = acDoc.Editor.GetKeywords(chFormat);
  81.             //Application.ShowAlertDialog("The name entered was: "+formatID.StringResult);
  82.  
  83.             //Установить кратность
  84.             PromptStringOptions chMultiplier = new PromptStringOptions("\nSet multiplier: ");
  85.             chMultiplier.AllowSpaces = false;
  86.             PromptResult multiplier = acDoc.Editor.GetString(chMultiplier);
  87.  
  88.  
  89.             // Установить ориентацию
  90.             PromptKeywordOptions chOrient = new PromptKeywordOptions("\nSet orientation: ");
  91.  
  92.             chOrient.Keywords.Add("Portrait");
  93.             chOrient.Keywords.Add("Landscape");
  94.             chOrient.Keywords.Default = "Landscape";
  95.             chOrient.AllowNone = false;
  96.  
  97.             PromptResult orientation = acDoc.Editor.GetKeywords(chOrient);
  98.  
  99.  
  100.             // Установить тип
  101.             PromptKeywordOptions chType = new PromptKeywordOptions("\nSet type: ");
  102.  
  103.             chType.Keywords.Add("Title");
  104.             chType.Keywords.Add("Regular");
  105.             chType.Keywords.Default = "Regular";
  106.             chType.AllowNone = false;
  107.  
  108.             PromptResult type = acDoc.Editor.GetKeywords(chType);
  109.  
  110.  
  111.             Format curFormat = new Format()
  112.             {
  113.                 formatID = formatID.ToString(),
  114.                 multiplier = int.Parse(multiplier.StringResult),
  115.                 orientation = orientation.ToString(),
  116.                 type = type.ToString()
  117.             };
  118.  
  119.             return curFormat;
  120.  
  121.         }
  122.  
  123.         public void DrawMainTitle()
  124.         {
  125.  
  126.         }
  127.  
 
Название: Re: Оффтопик. Изучаем C#
Отправлено: Дмитрий Загорулькин от 26-05-2018, 10:56:52
Не срабатывает установка размеров из списка в зависимости от пользовательского ввода через if else.
А как проявляется это самое "не срабатывает"?
Название: Re: Оффтопик. Изучаем C#
Отправлено: Atomohod от 26-05-2018, 11:58:25
Рамки рисуются каким-то невероятным образом, хотя при жестком указании height и width все отрабатывает нормально. Проблема в том, что нужно изменение поведения программы в зависимости от пользовательского ввода. Пытался реализовать не через if else, а через switch - тоже не срабатывало-я пролетал на default минуя все case, но там хотя бы рисовалась рамка для дефолтного формата, а через if вообще какая-то ерунда.
(https://s9.postimg.cc/5kt07uzm3/2018-05-25_235421.jpg) (https://postimg.cc/image/5kt07uzm3/)

Может я что-то упустил в структуре программы или не так записал в синтаксисе?
На форуме мне предлагали способ со вставкой форматки из готового блока в dwg, я с ним согласен, но задачу мне поставили по- другому поэтому все надо через dll.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Kisli от 16-06-2018, 15:49:52
Здравствуйте. Проблема в задании стилей для WPF. Хочется сделать это централизовано как в обычном WPF приложении. Но так как вынужден делать через библиотеку классов, не получается подключить ResourseDictionary со стилями, так же просто (обычно это делал через App.xaml), но в библиотеке классов нет такой возможности. Есть ли решение этой проблемы?
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Ривилис от 16-06-2018, 17:27:39
Есть ли решение этой проблемы?
Если я правильно понял вопрос, то может это подойдёт:
https://stackoverflow.com/questions/19270018/wpf-style-for-control-library
https://stackoverflow.com/questions/9739032/set-up-application-resources-from-code
Название: Re: Оффтопик. Изучаем C#
Отправлено: Kisli от 17-06-2018, 12:43:40
Есть ли решение этой проблемы?
Если я правильно понял вопрос, то может это подойдёт:
https://stackoverflow.com/questions/19270018/wpf-style-for-control-library
https://stackoverflow.com/questions/9739032/set-up-application-resources-from-code

Благодарю, попробую эти решения!
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Пекшев aka Modis от 17-06-2018, 13:14:01
Здравствуйте. Проблема в задании стилей для WPF. Хочется сделать это централизовано как в обычном WPF приложении. Но так как вынужден делать через библиотеку классов, не получается подключить ResourseDictionary со стилями, так же просто (обычно это делал через App.xaml), но в библиотеке классов нет такой возможности. Есть ли решение этой проблемы?
Все там замечательно подключается и работает!
Во-первых - посмотрите как нужно использовать URI типа Pack (https://docs.microsoft.com/ru-ru/dotnet/framework/wpf/app-development/pack-uris-in-wpf) (это то, что вам и нужно)
Во-вторых - смотрите готовые библиотеки оформления и инструкции к ним. Например, Mahapps Metro (https://mahapps.com/guides/quick-start.html) отлично демонстрирует как следует подключать xaml-ресурсы:
Код - XML [Выбрать]
  1. <Application x:Class="WpfApplication.App"
  2.             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.             StartupUri="MainWindow.xaml">
  5.   <Application.Resources>
  6.     <ResourceDictionary>
  7.       <ResourceDictionary.MergedDictionaries>
  8.         <!-- MahApps.Metro resource dictionaries. Make sure that all file names are Case Sensitive! -->
  9.         <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" />
  10.         <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml" />
  11.         <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Colors.xaml" />
  12.         <!-- Accent and AppTheme setting -->
  13.         <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/Blue.xaml" />
  14.         <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/BaseLight.xaml" />
  15.       </ResourceDictionary.MergedDictionaries>
  16.     </ResourceDictionary>
  17.   </Application.Resources>
  18. </Application>
Название: Re: Оффтопик. Изучаем C#
Отправлено: Вильдар от 17-06-2018, 13:39:20
Саня, твой вариант подходит для своего WPF приложения.
А автокад это не WPF приложение. У него System.Windows.Application.Current пустое.
Один раз такое пробовал:
Код - C# [Выбрать]
  1.              if (System.Windows.Application.Current == null)
  2.             {
  3.                 new System.Windows.Application {ShutdownMode = ShutdownMode.OnExplicitShutdown};
  4.             }
  5.             System.Windows.Application.Current.Resources.MergedDictionaries.Add(System.Windows.Application.LoadComponent(
  6.                     new Uri("AcadTest;component/Style.xaml", UriKind.Relative)) as ResourceDictionary);
Рисковый вариант. Т.к. может подействовать на весь интерфейс автокада:

(https://s15.postimg.cc/x6xlx1eh3/Clipboard01.jpg) (https://postimg.cc/image/x6xlx1eh3/)

Мне кажется, правильнее сделать файл стилей и подгружать его в свои окна или контролы:
     
Код - XML [Выбрать]
  1.     <Window.Resources>
  2.         <ResourceDictionary>
  3.             <ResourceDictionary.MergedDictionaries>
  4.                 <ResourceDictionary Source="Resources/Style.xaml" />
  5.             </ResourceDictionary.MergedDictionaries>
  6.         </ResourceDictionary>
  7.     </Window.Resources>
Можно через базовый класс. Я так и делаю.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Пекшев aka Modis от 17-06-2018, 13:46:09
Вильдар, все решается намного проще - нужно ResourceDictionary подключать не к App.xaml, а к ресурсам каждого окна. Может это и не универсально, зато точно работает
Название: Re: Оффтопик. Изучаем C#
Отправлено: Kisli от 17-06-2018, 17:42:41
Вильдар, все решается намного проще - нужно ResourceDictionary подключать не к App.xaml, а к ресурсам каждого окна. Может это и не универсально, зато точно работает

Благодарю, весь сыр бор как раз чтобы не подключать каждому окну, а делать это в 1 месте.  Да и темы из библиотек не подхватывает автоматом, надо прописывать. Думал что можно проще, но проще не запариваться с красивостями)
Название: Re: Оффтопик. Изучаем C#
Отправлено: Kisli от 17-06-2018, 17:46:39
Вильдар, все решается намного проще - нужно ResourceDictionary подключать не к App.xaml, а к ресурсам каждого окна. Может это и не универсально, зато точно работает
Благодарю!
Название: Re: Оффтопик. Изучаем C#
Отправлено: simson43 от 01-09-2018, 21:46:58
Здравствуйте. подскажите пожалуйста.
работая в visual studio c# возможно ли проверять код не перезапуская автокад?
пока что приходится каждый раз компилировать , затем открывать автокад, подгружать dll, и только затем тестировать.
при попытке скомпилировать измененный код выдает ошибку. закрыв автокад все норм.
спасибо!
Название: Re: Оффтопик. Изучаем C#
Отправлено: Дмитрий Загорулькин от 01-09-2018, 23:31:53
работая в visual studio c# возможно ли проверять код не перезапуская автокад?
По простому - нет.
Если очень хочется - можете попробовать динамическое прототипирование (https://youtu.be/SF_JTs30xEY?t=20m7s)
Название: Re: Оффтопик. Изучаем C#
Отправлено: Вильдар от 03-09-2018, 08:13:29
работая в visual studio c# возможно ли проверять код не перезапуская автокад?
Есть такой вариант https://github.com/vildar82/AcadAddinManager
Каждый раз, грузится новая сборка и через рефлексию запускается метод выбранной команды.
Работает, примерно, как AddinManager в Revit.
Название: Re: Оффтопик. Изучаем C#
Отправлено: simson43 от 11-11-2018, 21:19:29
Здравствуйте.
Наверное здесь не в тему, но больше некуда. Вы самые общительные - выручайте!
такая проблема
в WinForm следующий код работает:

Код - C# [Выбрать]
  1. private void listBoxFiles_DragEnter(object sender, DragEventArgs e)
  2.         {
  3.             if (e.Data.GetDataPresent(DataFormats.FileDrop, false))
  4.             {
  5.                 e.Effect = DragDropEffects.All;
  6.             }
  7.         }

а аналогичный в WPF (за исключение вместо Effect там будет Effects ) не работает:

Код - C# [Выбрать]
  1. private void listBoxFiles_DragEnter(object sender, DragEventArgs e)
  2.         {
  3.             if (e.Data.GetDataPresent(DataFormats.FileDrop, false))
  4.             {
  5.                 e.Effects = DragDropEffects.All;
  6.             }
  7.         }

что я не так делаю?

нужно чтоб он позволял перетаскивать только файлы. а на него эти строчки никак не влияют. что с ними что без. разрешает тащить и файлы и текст все подряд.

Спасибо!
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Пекшев aka Modis от 11-11-2018, 21:58:27
https://stackoverflow.com/questions/5662509/drag-and-drop-files-into-wpf
Название: Re: Оффтопик. Изучаем C#
Отправлено: simson43 от 11-11-2018, 22:02:55
где там ответ?
там получают файлы.
а мне нужно запретить пихать в листбокс все кроме файлов.
и в конце концов интересно почему выставляя effects=none ничего не меняется и я все равно могу что угодно дропать в лист(
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Пекшев aka Modis от 11-11-2018, 22:05:53
где там ответ?
там получают файлы.
а мне нужно запретить пихать в листбокс все кроме файлов.
и в конце концов интересно почему выставляя effects=none ничего не меняется и я все равно могу что угодно дропать в лист(
Используйте не DragEnter, а DragOver
Название: Re: Оффтопик. Изучаем C#
Отправлено: simson43 от 11-11-2018, 22:22:28
ничего не меняется.
я думаю не в событии дело
а в этом Effects
я назначаю ему значение none  но ничего не происходит.

 а в winform пока я не дам значение all не смогу ничего дропнуть.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Пекшев aka Modis от 11-11-2018, 22:27:13
Вот нашел пример:
Код - C# [Выбрать]
  1. /// <summary> Event, which is called, when dragged file enters form </summary>
  2. private void UIElement_OnDragEnter(object sender, DragEventArgs e)
  3. {
  4.     if (e.Data.GetDataPresent(DataFormats.FileDrop))
  5.     {
  6.         e.Effects = DragDropEffects.All;
  7.     }
  8.     else
  9.     {
  10.         e.Effects = DragDropEffects.None;
  11.     }
  12. }

Пишут, что работает. Если у вас не работает, то, видимо, проблема где-то в другом месте
Название: Re: Оффтопик. Изучаем C#
Отправлено: simson43 от 11-11-2018, 22:36:06
для winform да работает
при чем если вовсе убрать этот обработчик то не разрешает дропать.
в WPF же что с ним что без 0 реакции
Название: Re: Оффтопик. Изучаем C#
Отправлено: simson43 от 11-11-2018, 22:38:39
еще такая проблема
в начале выполнении операции я меняю текст кнопки информирую что процесс пошел. по окончании возвращаю значение обратно.
но по факту ничего не меняется будто не изменял  текст кнопки. но если я не возвращаю первоначальное значение то оно меняется но после выполнения операции.
т е он настолько загружен что не может отобразить изменения?

в winform такая стратегия работает.

Название: Re: Оффтопик. Изучаем C#
Отправлено: simson43 от 11-11-2018, 22:58:43
решил проблему! во первых, как вы сказали запихал все в событие over, во вторых, добавил одну волшебную строчку (e.Handled = true;), в третьих я (в отличии от любимых winform) не разрешал дропать, присваивая значение all, а запрещал, присваивая none.
вот рабочий код

Код - C# [Выбрать]
  1. private void listBoxFiles_DragOver(object sender, DragEventArgs e)
  2.         {
  3.             if (!e.Data.GetDataPresent(DataFormats.FileDrop, false))
  4.             {
  5.                 e.Effects = DragDropEffects.None;
  6.                 e.Handled = true;
  7.             }
  8.         }
Название: Re: Оффтопик. Изучаем C#
Отправлено: simson43 от 25-03-2019, 13:14:08
Возник вопрос касательно класса FileSystemWatcher.
можно ли им пользоваться, если дело касается сетевых дисков? попробовал прописать путь к сетевому диску, но в итоге он просто не реагирует на изменения
с локальным диском все работает
Название: Re: Оффтопик. Изучаем C#
Отправлено: Дмитрий Загорулькин от 25-03-2019, 14:41:02
Возник вопрос касательно класса FileSystemWatcher.
можно ли им пользоваться, если дело касается сетевых дисков?
У меня с этим не было проблем.
Название: Re: Оффтопик. Изучаем C#
Отправлено: simson43 от 25-03-2019, 14:44:34
Наверное важное уточнение: по факту это облако, представленное сетевым диском.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Дмитрий Загорулькин от 25-03-2019, 14:49:46
Ну тут надо смотреть как это облако работает. По идее, все облачные хранилища, которые я встречал, имеют папку-буфер на жёстком диске. А эта папка синхронизируется с облачным хранилищем. Вот если к этой папке подключиться - то мониторинг будет работать.
Название: Re: Оффтопик. Изучаем C#
Отправлено: simson43 от 26-03-2019, 13:05:10
пойдя чуть дальше пробую читать файл из облака и сравнивать побайтово с локальной копией
и видимо скачанные из облака файлы чем то отличаются (датой как минимум)? но у всех файлов после 15000 байта начинаются различия, хотя файлы только что скопированы и не изменялись...
соответственно файлы меньшего размера (по 14000 байтов) считаются одинаковыми
как тогда ты корректно сравнить?
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Ривилис от 26-03-2019, 13:07:17
simson43,
А что за облако?
Название: Re: Оффтопик. Изучаем C#
Отправлено: simson43 от 26-03-2019, 13:07:38
SharePoint
Название: Re: Оффтопик. Изучаем C#
Отправлено: Дмитрий Загорулькин от 26-03-2019, 13:09:57
Насколько я знаю, у него есть свой API. Может в нём есть нужные инструменты?
Название: Re: Оффтопик. Изучаем C#
Отправлено: simson43 от 26-03-2019, 13:20:01
через него я и получил Stream
а вот аналога FileSystemWatcher не нашел(
Название: Re: Оффтопик. Изучаем C#
Отправлено: simson43 от 26-03-2019, 16:09:14
до этого я считывал асинхронно
Код - C# [Выбрать]
  1. await locStream.ReadAsync(locBytes, 0, length);
а если же считывать синхронно побайтно
Код - C# [Выбрать]
  1.  while (true)
  2.             {
  3.                 int lVal = locStream.ReadByte();
  4.                 int sVal = spStream.ReadByte();
  5.  
  6.                 if (lVal == -1 && sVal == -1)
  7.                     return true;
  8.  
  9.                 if ( lVal != sVal)
  10.                     return false;
  11.             }
То такой ситуации не возникает. И одинаковость файлов определяется корректно.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Ривилис от 26-03-2019, 16:20:29
То такой ситуации не возникает. И одинаковость файлов определяется корректно.
Ну видимо для этого потока асинхронное считывание недопустимо...
Название: Re: Оффтопик. Изучаем C#
Отправлено: avc от 29-05-2020, 19:39:12
Такой вопрос: нельзя ли как-то в Visual Studio скомпилировать одну dll из двух проектов?
Или сделать общую папку кода для нескольких проектов?
Поясню зачем мне это. У меня пачка плагинов и в итоге 48 проектов в решении. Когда добавляю еще один файл кода общего назначения, то приходится делать ссылку на него в каждом проекте вручную. Очень утомляет. Хочу добавлять файл в одно место, в один проект или папку и чтоб он таким образом добавился во все проекты.
Выделить общий код в отдельную dll - не вариант по многим причинам, нужна единая dll для каждого плагина.
Догадываюсь, что так не получится....
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Ривилис от 29-05-2020, 19:51:27
avc,
Похоже, что ближе всего к тому, что ты хочешь вот это: https://docs.microsoft.com/en-us/visualstudio/msbuild/how-to-use-the-same-target-in-multiple-project-files?view=vs-2019
Но насколько тебе это будет удобно использовать - это вопрос.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Вильдар от 29-05-2020, 22:55:00
avc,
https://docs.microsoft.com/ru-ru/visualstudio/msbuild/customize-your-build?view=vs-2019
может попробовать Directory.Build.props, в котором указать папку для компиляции всех файлов в ней. я не пробовал так. но может можно.
Если я правильно понял, нужно добавить cs файл во все проекты в решении. По идее может срабоать.
Т.е. выделить общую папку для общих cs файлов для всего решения и загнать их через файл Directory.Build.props.
Щас я даже попробую

Вот так по одному файлу работает - ссылкой добавляется во все проекты.
Но, наверно, можно как то папку указать и все файлы *.cs оттуда.
Код - XML [Выбрать]
  1. <Project>  
  2.   <ItemGroup>
  3.     <Compile Include="$(SolutionDir)\Common\Data.cs">
  4.       <Link>Data.cs</Link>
  5.     </Compile>
  6.   </ItemGroup>
  7. </Project>
Название: Re: Оффтопик. Изучаем C#
Отправлено: avc от 31-05-2020, 22:20:15
может попробовать Directory.Build.props
Попробовал. Получилось. В самом деле можно переместить все линки на исходники в Directory.Build.props и проект будет компилироваться. И можно создать сколько угодно файлов .targets с такими же ссылками. Только придется в ручную прописать эти таргеты в csproj. Так тоже работает. Но есть один нюанс... обозреватель решений в VS вообще никак не показывает ни файлы с кодом, ни targets... Т.е. можно вообще пустой проект оставить, но он будет компилироваться!! Выглядит как шаманство. Работать с таким проектом невозможно - ни как файл не открыть. Думаю оставить один нормальный проект. Но боюсь потерять контроль, что там компилируется в остальных проектах...
Но насколько тебе это будет удобно использовать - это вопрос.
В таком виде, без поддержки визуальных редакторов VS, - да, удобство под большим вопросом...
Название: Re: Оффтопик. Изучаем C#
Отправлено: Дмитрий Загорулькин от 06-06-2020, 10:28:14
Ссылки на cs файлы хранятся в файлах csproj. Можно программно пробежаться по папкам решения, найти нужные csproj, открыть, внести нужные данные о ссылочных файлах. Как вариант - консольное приложение с конфиг-файлом настроек.
Я как-то написал похожий "ленивчик", только на WPF, для автоматизации рутины при сборке. Пару дней на написание потратил и уже года два пользуюсь. Запустил, проверил настройки, выбрал галочками нужные решения. Далее приложение пробегает по файлам, генерирует и выставляет номер версии и ProductCode новые, собирает инсталляторы и пушит изменения в репозиторий гит.
Название: Re: Оффтопик. Изучаем C#
Отправлено: avc от 06-06-2020, 11:20:10
Можно программно пробежаться по папкам решения
Да можно и не программно - Notepad++ прекрасно подменяет текст в любом количестве файлов заданного типа. В случаях переименования я только так и делаю. Но я искал более удобные встроенные возможности самой VS. И они даже нашлись, вот только реализация... не очень.
Название: Re: Оффтопик. Изучаем C#
Отправлено: avc от 19-08-2020, 11:36:37
Подскажите пожалуйста, во время отладки плагинов над Автокадом появляется вот такая раздражающая менюшка:
(https://i.postimg.cc/Hj2FK5dq/image.png) (https://postimg.cc/Hj2FK5dq)
Похоже, что это отладчик VS рисует. Но ни одна кнопка не работает и ни на что не влияет. Что это такое? Как отключить? Или еще лучше - как использовать для дела?
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Ривилис от 19-08-2020, 11:45:45
Тоже обратил внимание, на появление такой менюшки. Кажется она появилась с VS 2017, и в предыдущих версиях её не было (возможно при каком-то из обновлений). Не пользуюсь и стараюсь не обращать внимание.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Вильдар от 19-08-2020, 11:48:33
Это настраивается в опциях отладки в VS:
(https://i.postimg.cc/vc8d2W5L/debug-Options.jpg) (https://postimg.cc/vc8d2W5L)

Смысл иногда есть - на элементы окна потыкать.
Удобно изменение разметки во время отладки.
Редко пользуюсь.
Название: Re: Оффтопик. Изучаем C#
Отправлено: avc от 19-08-2020, 12:00:32
Сейчас сам дошел: нажал одну из кнопок, студия показала какую-то незнакомую панель а в ней что-то про XAML. По этому слову нашел настройку. В русской студии кнопка отключения выглядит так:
(https://i.postimg.cc/gLcC2yv6/1.png) (https://postimg.cc/gLcC2yv6)
Почитал в Wiki про этот XAML - похоже это другое название для форм WPF. Да? Тогда понятно почему оно ни как не работает ни в Автокад, ни в моих панельках WinForms...
Название: Re: Оффтопик. Изучаем C#
Отправлено: trir от 19-08-2020, 12:13:16
Цитировать
Почитал в Wiki про этот XAML - похоже это другое название для форм WPF.
не совсем, у WinForms есть .Designer.cs - где находится код генерации формы, его можно править ручками, но так как он автогенерируется - лучше этого не делать
XAML выполняет ту же роль, но только редактирование WPF подразумевает в первую очередь редактирование XAML   
XAML более читаемый, чем .Designer.cs. А ещё с ним удобно делать copy/past
Название: Re: Оффтопик. Изучаем C#
Отправлено: avc от 19-08-2020, 12:22:42
Спасибо. Я как-то так и представлял. Но похоже эта менюшка не в курсе про WinForms.

Кстати .designer.cs редактирую ежедневно и без всяких проблем. Это часто удобнее чем в визуальном редакторе. Иногда незаменимо - редактор, например, не умеет менять местами докированные панельки. Да и не запускается он пока весть код всех предков не перекомпилируется. Собственно по этому и пользуюсь WinForm - все на C#, изучать другие языки нет необходимости, переключать мозг на другой синтаксис не надо. Обалденно круто придумано :)
Название: Re: Оффтопик. Изучаем C#
Отправлено: trir от 19-08-2020, 12:25:05
всё равно WPF удобней WinForms
а учить языки - полезно для мозгов
XAML ещё и более компактен
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Пекшев aka Modis от 25-10-2020, 22:33:22
Или еще лучше - как использовать для дела?
Очень клевая фича, кстати! Можно изменять разметку окон прям на живую во время отладки и сразу видеть результат. Конечно, с плагинами не прокатит, хотя вроде тоже получалось.
А еще через неё можно просматривать дерево элементов окна, что может быть полезным при динамических шаблонах.
И еще там много каких-то полезностей
Название: Re: Оффтопик. Изучаем C#
Отправлено: Lemieux от 06-02-2021, 11:03:50
Всех приветствую.
Кто-нибудь тут пользуется Regex? Я не могу решить задачу  с помощью только одного Match.
Есть строки типа "A1=A3", "A1-10", "SF10", "01.XT5". Мне нужно получить вот такие группы соответственно: (A1=A)(3), (A1-)(10), (SF)(10), (01.XT)(5).
Не хватает мозгов чтобы написать паттерн для всех случаев. Пока только сделал вот такой костыль:
Код - C# [Выбрать]
  1. string str = "A1=A3";
  2. string number = Regex(str, @"\d+$").Value;
  3. string device = str.TrimEnd(number.ToCHarArray());
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Пекшев aka Modis от 06-02-2021, 12:04:11
Всех приветствую.
Кто-нибудь тут пользуется Regex? Я не могу решить задачу  с помощью только одного Match.
Есть строки типа "A1=A3", "A1-10", "SF10", "01.XT5". Мне нужно получить вот такие группы соответственно: (A1=A)(3), (A1-)(10), (SF)(10), (01.XT)(5).
Не хватает мозгов чтобы написать паттерн для всех случаев. Пока только сделал вот такой костыль:
Код - C# [Выбрать]
  1. string str = "A1=A3";
  2. string number = Regex(str, @"\d+$").Value;
  3. string device = str.TrimEnd(number.ToCHarArray());

Одна минута гугла и тыц - вот ответ (https://stackoverflow.com/a/14294200).

И проверка:

(https://i.postimg.cc/kRVGBXmj/image.png) (https://postimg.cc/kRVGBXmj)
Название: Re: Оффтопик. Изучаем C#
Отправлено: Lemieux от 06-02-2021, 19:14:46
Всех приветствую.
Кто-нибудь тут пользуется Regex? Я не могу решить задачу  с помощью только одного Match.
Есть строки типа "A1=A3", "A1-10", "SF10", "01.XT5". Мне нужно получить вот такие группы соответственно: (A1=A)(3), (A1-)(10), (SF)(10), (01.XT)(5).
Не хватает мозгов чтобы написать паттерн для всех случаев. Пока только сделал вот такой костыль:
Код - C# [Выбрать]
  1. string str = "A1=A3";
  2. string number = Regex(str, @"\d+$").Value;
  3. string device = str.TrimEnd(number.ToCHarArray());

Одна минута гугла и тыц - вот ответ (https://stackoverflow.com/a/14294200).

И проверка:

(https://i.postimg.cc/kRVGBXmj/image.png) (https://postimg.cc/kRVGBXmj)
Проверил в VS, не работает. Да и не понятно как может работать, если в паттерне указываются только цифровые символы и точка, хотя мне надо получить две группы цифро-буквенно-символьных знаков и цифр. Цифры в конце получаются гораздо легче из примера моего костыля.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Пекшев aka Modis от 06-02-2021, 19:18:43
Проверил в VS, не работает

На скриншоте отчетливо видно, что паттерн работает. Если вы применить его в коде не можете, то это уже другой вопрос
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Пекшев aka Modis от 06-02-2021, 19:27:21
Вот вариант с разбивкой на группы:

Код - C# [Выбрать]
  1. (.*?)(\d+(\.\d+)?$)

Тут даже не надо потом мудрить с выниманием нужных данных из строки, так как сразу можно получить две группы (https://docs.microsoft.com/ru-ru/dotnet/api/system.text.regularexpressions.match.groups?view=net-5.0)

(https://i.postimg.cc/MXTpJFw5/image.png) (https://postimg.cc/MXTpJFw5)
Название: Re: Оффтопик. Изучаем C#
Отправлено: Lemieux от 06-02-2021, 19:29:40
Проверил в VS, не работает

На скриншоте отчетливо видно, что паттерн работает. Если вы применить его в коде не можете, то это уже другой вопрос

Что значит не могу? А это что?
Код - C# [Выбрать]
  1. string s1 = "A1=A3";
  2. Match match = Regex.Match(s1, @"d+(\.\d+)?$");
И в match просто "{}".
Название: Re: Оффтопик. Изучаем C#
Отправлено: Lemieux от 06-02-2021, 19:33:21
Вот вариант с разбивкой на группы:

Код - C# [Выбрать]
  1. (.*?)(\d+(\.\d+)?$)

Тут даже не надо потом мудрить с выниманием нужных данных из строки, так как сразу можно получить две группы (https://docs.microsoft.com/ru-ru/dotnet/api/system.text.regularexpressions.match.groups?view=net-5.0)

(https://i.postimg.cc/MXTpJFw5/image.png) (https://postimg.cc/MXTpJFw5)
Что это за магический сайт? У него свой Regex? Ни один пример не работает в VS, как не используй класс Regex. Может конечно я что-то не так делаю, но что там делать в 2-3 строчках.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Пекшев aka Modis от 06-02-2021, 19:35:10
Что это за магический сайт?

https://regex101.com/

Может конечно я что-то не так делаю

Вероятнее всего
Название: Re: Оффтопик. Изучаем C#
Отправлено: Lemieux от 06-02-2021, 19:36:01
Вероятнее всего
Так, а что может быть не так?
Название: Re: Оффтопик. Изучаем C#
Отправлено: Lemieux от 06-02-2021, 19:41:40
https://regex101.com/
А где там C#?
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Пекшев aka Modis от 06-02-2021, 19:43:58
https://regex101.com/
А где там C#?

А причем тут C#? Regex - это не фича сишарпа

Вот проверил - все работает:

(https://i.postimg.cc/jWn30K5N/image.png) (https://postimg.cc/jWn30K5N)
Название: Re: Оффтопик. Изучаем C#
Отправлено: Lemieux от 06-02-2021, 20:00:04
https://regex101.com/
А где там C#?

А причем тут C#? Regex - это не фича сишарпа

Вот проверил - все работает:

(https://i.postimg.cc/jWn30K5N/image.png) (https://postimg.cc/jWn30K5N)

Спасибо за помощь, но у меня почему-то не работает данный код. Буду разбираться.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Lemieux от 06-02-2021, 21:24:59
Проверил в новом проекте, в Visual Studio Code на винде и линуксе, ни где не работает. Не понимаю, что не так.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Lemieux от 06-02-2021, 22:27:51
Это фиаско. Не заметил, что при копировании с сайта добавились пробелы.
Название: Re: Оффтопик. Изучаем C#
Отправлено: trir от 08-02-2021, 07:33:49
я тоже на этом пару раз спотыкался, в итоге включил отображение табуляции в vs
Название: Re: Оффтопик. Изучаем C#
Отправлено: Lemieux от 29-07-2021, 09:04:19
Всех приветствую.
Кто-то может объяснить на пальцах, что такое внедрение зависимостей и зачем огород с интерфейсами и их реализацией? Или такое не объяснить на пальцах?
Сколько не читаю разных людей и не смотрю разных примеров, не могу найти практического применения. Или это всё из-за того, что я пока не писал/не видел/не работал на больших проектах где DI даёт преимущество?
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Пекшев aka Modis от 29-07-2021, 09:21:34
Всех приветствую.
Кто-то может объяснить на пальцах, что такое внедрение зависимостей и зачем огород с интерфейсами и их реализацией? Или такое не объяснить на пальцах?
Сколько не читаю разных людей и не смотрю разных примеров, не могу найти практического применения. Или это всё из-за того, что я пока не писал/не видел/не работал на больших проектах где DI даёт преимущество?

При разработке проектов уровня плагинов - это как забивание гвоздей кувалдой. Даже если вы разберетесь с этим, то толку от этого будет ноль
Название: Re: Оффтопик. Изучаем C#
Отправлено: Lemieux от 29-07-2021, 09:26:13
При разработке проектов уровня плагинов - это как забивание гвоздей кувалдой. Даже если вы разберетесь с этим, то толку от этого будет ноль
Вполне вероятно. Я просто иногда читаю по C# литературу, смотрю примеры и сталкиваюсь с новыми понятиями/инструментами/подходами и мне становится интересно изучить всё это. И вот бывает так, что я не понимаю, что к чему и зачем вообще это придумали.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Пекшев aka Modis от 29-07-2021, 09:48:14
При разработке проектов уровня плагинов - это как забивание гвоздей кувалдой. Даже если вы разберетесь с этим, то толку от этого будет ноль
Вполне вероятно. Я просто иногда читаю по C# литературу, смотрю примеры и сталкиваюсь с новыми понятиями/инструментами/подходами и мне становится интересно изучить всё это. И вот бывает так, что я не понимаю, что к чему и зачем вообще это придумали.

Ну если просто на пальцах, то внедрение зависимостей работает примерно так:
При старте приложения создается DI контейнер. В контейнере регистрируются типы. Ну, например, у вас есть класс ClassA и класс ClassB - вы их регистрируете в контейнере.
Далее, при работе вам нужно, чтобы в ClassB использовался ClassA. Для этого вы просто в конструкторе ClassB добавляете аргументом ClassA и все. При работе приложения там контейнер уже сам разберется и внедрит экземпляры нужных классов.
Конечно, там чуть посложнее и есть ряд условий и ограничений

Ну а использование интерфейсов позволяет менять реализации сервисов не меняя кода, использующего интерфейсы. Можно даже в рантайме менять. Например, вы сделали интерфейс IPrinter с методом Print. Можете сделать класс PdfPrinter и класс WordPrinter. Думаю, понятно, что если вы используете в коде интерфейс, то неважно какой экземпляр класса подсунуть - оба работать будут
Название: Re: Оффтопик. Изучаем C#
Отправлено: Дмитрий Загорулькин от 29-07-2021, 11:18:34
И вот бывает так, что я не понимаю, что к чему и зачем вообще это придумали.
Значит, ещё пока рано браться за такие вещи. Это примерно как браться за изучение высшей математики в начальных классах, когда только-только таблицу умножения выучили. Нужно как-то постепенно к этому приходить. Сперва понять что такое ООП и как им пользоваться. Потом понять, какие проблемы могут возникать и как решают эти проблемы. Тогда будет понятнее, зачем применяют шаблоны (паттерны) и придерживаются принципов (SOLID и т.п.). Поизучать про тестирование приложений и понять, как писать код, который будет легче тестировать. И потом уже должно прийти понимание, что DI (dependency injection) - это довольно полезная штука. Есть и минусы, конечно.
Ну и да - в целом, плагины для CAD-BIM приложений можно писать и без этого, не погружаясь глубоко в эту тему. Но если есть цель расширить сферу деятельности, вырасти именно как .NET-программист, то надо изучать. Например, в ASP.NET Core (разработка веб-приложений) без понимания DI - никак совсем.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Lemieux от 29-07-2021, 12:09:01
Значит, ещё пока рано браться за такие вещи. Это примерно как браться за изучение высшей математики в начальных классах, когда только-только таблицу умножения выучили. Нужно как-то постепенно к этому приходить. Сперва понять что такое ООП и как им пользоваться. Потом понять, какие проблемы могут возникать и как решают эти проблемы. Тогда будет понятнее, зачем применяют шаблоны (паттерны) и придерживаются принципов (SOLID и т.п.). Поизучать про тестирование приложений и понять, как писать код, который будет легче тестировать. И потом уже должно прийти понимание, что DI (dependency injection) - это довольно полезная штука.
Исходя из этого выходит, что я вообще ничего не понимаю  :'( ;D
Название: Re: Оффтопик. Изучаем C#
Отправлено: Алексей Кулик от 29-07-2021, 12:12:28
Lemieux, ты не одинок :) Я тоже вообще ничего в C# не понимаю ))
Название: Re: Оффтопик. Изучаем C#
Отправлено: Дмитрий Загорулькин от 29-07-2021, 12:32:20
Исходя из этого выходит, что я вообще ничего не понимаю
Так это нормально. Просто надо учиться и практиковаться. Со временем понимание придёт. Я помню в 2012 году когда первую книгу по C# читал, например, совсем не понимал зачем в языке есть такие вещи как интерфейсы - и так же понятно, что у класса есть такие-то методы и свойства. Зачем дополнительно их выносить в описание без реализации? На крайний случай, есть базовые классы, абстрактные классы. В общем, непонятно было. Потом, когда столкнулся с проблемой при разработке, когда понадобилось сделать одинаковую обработку для совершенно разных классов и даже структур, тогда вспомнил: "о, так есть же интерфейс!". Ну и так со всем остальным.
Название: Re: Оффтопик. Изучаем C#
Отправлено: trir от 29-07-2021, 13:53:53
Делал интерфейс для работы с данными ГАР. К форме через интерфейс цепляется вьюмодель. Делаю отображение муниципальной иерархии, сделал хитрую форму, а когда уже всё было готово - понял, что мне нужна административная иерархия. Сделал новую вьюмодель для административной иерархии и зарегистрировал её для старого интерфейса - и всё сразу заработало!
Название: Re: Оффтопик. Изучаем C#
Отправлено: Lemieux от 29-07-2021, 14:42:36
Делаю отображение муниципальной иерархии, сделал хитрую форму
К форме через интерфейс цепляется вьюмодель.
понял, что мне нужна административная иерархия
Сделал новую вьюмодель
Зачем тут прослойка в виде интерфейса? По сути нас это ни от чего не избавило, судя по Вашему сообщению.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Дмитрий Загорулькин от 29-07-2021, 16:23:44
Зачем тут прослойка в виде интерфейса? По сути нас это ни от чего не избавило
soliD (https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF_%D0%B8%D0%BD%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D0%B8_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B5%D0%B9)
Название: Re: Оффтопик. Изучаем C#
Отправлено: trir от 30-07-2021, 07:42:39
у меня гуи и вьюмодель в разных проектах и было достаточно изменить регистрацию вьюмодели, проект с гуи даже не надо было перекомпилировать
в принципе можно сделать селектор и использовать обе вьюмодели
Название: Последовательность выбора объекта
Отправлено: Рустем от 10-10-2021, 09:36:44
Здравствуйте. Подскажите почему если мы запишем BlockReference полученный из транзакции  в локальную переменную, а потом попытаемся обратиться к ней также через транзакцию уже в рамках другой функции, то появится ошибка, что объект не может быть открыт для чтения. Я решил для себя эту проблему, просто использую EntityResult.ObjectId из GetEntity. Но как говорится в рамках спортивного интереса. Это тонкости работы CLR или тонкости работы Net??
Название: Re: Оффтопик. Изучаем C#
Отправлено: avc от 10-10-2021, 11:12:23
попытаемся обратиться к ней также через транзакцию
Это как?
Общее правило - нигде и никогда не хранить никаких объектов, полученных из транзакции (в смысле, вне тела транзакции не хранить). Их хранит транзакция. Если функция маленькая и вызывается часто, то можно передать в нее саму транзакцию и снова получить тот же объект из транзакции - получите ссылку на тот же самый объект, а не новый Entity, никаких выделений памяти и потерь времени. Если надо передавать объекты - то передавайте и храните ObjectId.
Название: Последовательность выбора объекта
Отправлено: Рустем от 10-10-2021, 18:24:00
Спасибо за ответ avc. Доступно и понятно. В LISP и VBA таких проблем нет, вот я и удивился. Вот скажем я получил BlockReference, из него BlockTableRecord из него выбрал AttributeReference посредством GetObject.  И вот я добрался до заветных полей "Tag" и  "TextString" и т.д. и все это в рамках одной транзакции. Получается мне нельзя эти поля сохранить, чтобы обратиться к ним из другой функции. В другой функции мне придется опять спускаться из ObjectId. Я не против, правила есть правила, но ведь как то это не совсем то. Вместо одной операции целых четыре. Видимо есть путь получить ссылки на атрибуты не используя транзакцию, записать все поля, потом уже обратиться к ним с использованием транзакции.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Ривилис от 10-10-2021, 18:30:04
И вот я добрался до заветных полей "Tag" и  "TextString" и т.д. и все это в рамках одной транзакции. Получается мне нельзя эти поля сохранить, чтобы обратиться к ним из другой функции.
Ну почему же нельзя. Указанные вами поля имеют тип string - строки можно сохранить. А вот сами наследники DBObject вне рамок транзакции невалидны.
Название: Re: Оффтопик. Изучаем C#
Отправлено: avc от 10-10-2021, 18:40:40
А я и не писал, что нельзя ПЕРЕДАВАТЬ. Нельзя СОХРАНЯТЬ. То есть в какой-то хелпер передать вполне можно. Главное, чтоб объект не сохранился ни в каких списках и полях класса после того, как уничтожена транзакция. Обращение к объекту уничтоженной транзакции - это гарантированный фатал Автокада. Но если вы уверены что ваш метод не оставит ссылок на Entity где-то во вне, то смело можете передавать. То что вы описываете - вполне можно делать с Entity пока не закрыта транзакция.
Извлечение атрибута из транзакции по его Id - это одна операция, а не 4. Почему бы и не передать его Id ?  ObjectId атрибута - это по сути и есть ссылка на атрибут. не такая прямая как вам хочется, зато безопасная.
Название: Re: Оффтопик. Изучаем C#
Отправлено: alz от 15-02-2023, 14:53:28
Подскажите как быть со сторонними библиотеками? Для склеивания pdf использовал библиотеку itext7 добавив через nuget, работает нормально, но теперь к dll в 250 кб прилагается пара десятков других размером под 18 метров, с этим можно что-то сделать или так и придется их таскать со своим файлом?
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Пекшев aka Modis от 15-02-2023, 15:09:25
Подскажите как быть со сторонними библиотеками? Для склеивания pdf использовал библиотеку itext7 добавив через nuget, работает нормально, но теперь к dll в 250 кб прилагается пара десятков других размером под 18 метров, с этим можно что-то сделать или так и придется их таскать со своим файлом?
Придется таскать. И более того - эта библиотека платная!
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Ривилис от 15-02-2023, 15:26:19
Для склеивания pdf использовал библиотеку itext7
Возможно тебе будет достаточно библиотеки itextsharp (бесплатная). Там требуется таскать только одну dll, размером меньше 2.5Мб.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Привалов Дмитрий от 15-02-2023, 16:18:52
И более того - эта библиотека платная!
Вроде iTextSharp5 можно использовать бесплатно
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Пекшев aka Modis от 15-02-2023, 16:45:53
И более того - эта библиотека платная!
Вроде iTextSharp5 можно использовать бесплатно
5.5.13.3 - последняя версия, которую можно использовать бесплатно. Но в вопросе указана 7 версия
Название: Re: Оффтопик. Изучаем C#
Отправлено: alz от 15-02-2023, 18:22:58
Возможно тебе будет достаточно библиотеки itextsharp (бесплатная). Там требуется таскать только одну dll, размером меньше 2.5Мб.
Блин, я сначала как раз itextsharp собрался ставить, но прочитал прям в ее описании что она устаревшая и вместо нее itext7 и поставил ее, сейчас поменял, правда пришлось полностью переписать модуль соединения, на этот раз написал сам, старый просто в виде функции скачанной из инета был. Теперь из дополнительных файлов только сам itextsharp.dll и BouncyCastle.Crypto.dll(хз что это, видимо что то в itextsharp использующееся). Спасибо за совет.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Александр Ривилис от 15-02-2023, 18:45:12
Теперь из дополнительных файлов только сам itextsharp.dll и BouncyCastle.Crypto.dll(хз что это, видимо что то в itextsharp использующееся)
Точно. Про вторую dll я забыл.
Название: Re: Оффтопик. Изучаем C#
Отправлено: alz от 15-02-2023, 21:03:22
И более того - эта библиотека платная!
А какой вообще признак платной библиотеки? Это только в пользовательском соглашении прописывается?
Почитал про itext7 там точно такая же лицензия как и в itextsharp - Open Source AGPLv3 license как я понял не для коммерческого использования можно пользоваться свободно? И какие-то ограничения вроде того что должен предоставить свой код написанный с помощью этой библиотеки и где-то прописывать ее упоминание.
Название: Re: Оффтопик. Изучаем C#
Отправлено: alz от 17-02-2023, 09:50:59
Еще один вопрос, для ограничения ввода в текстбоксы только цифр сделал public static класс в котором разместил несколько public static функций ограничивающих ввод определенных символов. В Designer создаю события типа KeyPress в котором ссылаюсь на эти функции, все прекрасно работает, но периодически эти события просто исчезают, в Visual Studio есть какие-то ограничения на события, ссылающиеся на другие классы?
Название: Re: Оффтопик. Изучаем C#
Отправлено: Алексей Кулик от 17-02-2023, 11:04:12
Если используется WPF, я бы подумал на предмет валидации данных в окне.
Название: Re: Оффтопик. Изучаем C#
Отправлено: alz от 17-02-2023, 11:07:47
Если используется WPF, я бы подумал на предмет валидации данных в окне.
Обычный winform
Название: Re: Оффтопик. Изучаем C#
Отправлено: Алексей Кулик от 17-02-2023, 11:09:40
https://habr.com/ru/post/209820/ ?
Название: Re: Оффтопик. Изучаем C#
Отправлено: alz от 17-02-2023, 12:05:46
https://habr.com/ru/post/209820/ ?
ну немного не то, у меня в textbox просто не вводятся или не вставляются символы, которые не являются числами, вопрос в том, что функция лежащая в самом классе формы работает нормально
Код - C# [Выбрать]
  1. this.textBox1_ur3.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.textBox_KeyPress_minus);
если же использовать такой код
Код - C# [Выбрать]
  1. this.textBox1_ur3.KeyPress += new System.Windows.Forms.KeyPressEventHandler(form_function.textBox_KeyPress_minus);
то код нормально компилируется, работает, но в какой-то момент эта строка из designer просто исчезает.
так то просто форм много и было бы проще сделать в одном месте эти функции и с каждой формы обращаться к этому классу чем на каждую новую форму их копировать, может я просто из-за отсутствия профильного образования не знаю каких-то нюансов в этом вопросе и так делать нельзя?
Название: Re: Оффтопик. Изучаем C#
Отправлено: Алексей Кулик от 17-02-2023, 12:23:27
Может, нечто типа:
Код - C# [Выбрать]
  1.         private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
  2.         {
  3.             OnlyNumbers. IsValueDigital(sender, e);
  4.         }
  5.  
  6. // Вообще в другом каталоге, отдельный класс
  7.     public static class OnlyNumbers
  8.     {
  9.         public static void IsValueDigital(object sender, KeyPressEventArgs e)
  10.         {
  11.             if (!Char.IsDigit(e.KeyChar))
  12.             {
  13.                 e.Handled = true;
  14.             }
  15.         }
  16.     }
По-быстрому проверил - вроде работает.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Привалов Дмитрий от 17-02-2023, 12:39:10
itext7
Если я не ошибаюсь itext5 был бесплатным, а потом сделали itext7 и он уже под другой лицензией
Название: Re: Оффтопик. Изучаем C#
Отправлено: Привалов Дмитрий от 17-02-2023, 12:54:12
Может, нечто типа:
Char.IsDigit(e.KeyChar

Давно что-то делал подобное, этот вариант не очень.
Нужно будет добавить +-. и сложно будет предотвратить случайный порядок нажатия символов  --+7...5.03+45.

Проще будет сделать так, после ввода симола пробовать парсить строку в нужное число
if (int.TryParse(text, out int res))...
if (double.TryParse(text, out int res))...

Или проверку через регулярные выражения реализовать, сложнее разобраться новичкам
if (Regex.IsMatch(text, @"^[+-]?\d*\.?\d*$"))...

Название: Re: Оффтопик. Изучаем C#
Отправлено: Алексей Кулик от 17-02-2023, 13:42:19
Да собственно этот "валидатор" может содержать в себе что угодно. Проблема в том, что он "отваливается".
Название: Re: Оффтопик. Изучаем C#
Отправлено: alz от 17-02-2023, 16:06:08
Проще будет сделать так, после ввода симола пробовать парсить строку в нужное число
if (int.TryParse(text, out int res))...
if (double.TryParse(text, out int res))...
Вот это очень плохой вариант, у меня помню парс игнорил запятую если она разделитель и выдавал число как целое состоящее из дробной и целой части, так что тут все не так просто, я просто запретил ввод всех символов кроме чисел, точки, запятой и минуса, причем запятая автоматом на точку заменяется, ну и там проверки что минус может быть только первым и только один, точка только одна и не может быть первым символом и тд. ну и запрет на копирование в ячейку, дает почти 100% шанс что ничего лишнего там не окажется, а парсится если это значение вообще если понадобится.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Привалов Дмитрий от 19-02-2023, 14:59:20
Вот это очень плохой вариант, у меня помню парс игнорил запятую если она разделитель
И поэтому это плохой вариант и нужно городить кучу кода для проверки?
а text.replace(',', '.'); впереди не судьба добавить?
Название: Re: Оффтопик. Изучаем C#
Отправлено: alz от 19-02-2023, 19:05:59
И поэтому это плохой вариант и нужно городить кучу кода для проверки?
а text.replace(',', '.'); впереди не судьба добавить?

Ну так то пофиг какой вариант использовать

Код - C# [Выбрать]
  1. public static void textBox_KeyPress_minus(object sender, KeyPressEventArgs e)
  2.         {
  3.             TextBox tTBox = sender as TextBox;              
  4.             if (double.TryParse(tTBox.Text + e.KeyChar, System.Globalization.NumberStyles.Any,
  5.                                     System.Globalization.CultureInfo.InvariantCulture, out _)) e.Handled = true;
  6.         }
или
Код - C# [Выбрать]
  1. public static void textBox_KeyPress_minus(object sender, KeyPressEventArgs e)
  2.         {
  3.            TextBox tTBox = sender as TextBox;
  4.             if (e.KeyChar == ',') e.KeyChar = '.';        
  5.             if (!Char.IsDigit(e.KeyChar) && (e.KeyChar != 8) && ((e.KeyChar != '-') || (tTBox.Text.IndexOf("-") == 0) || tTBox.SelectionStart != 0) &&
  6.                 ((e.KeyChar != '.') || (tTBox.Text.IndexOf(".") != -1) || (tTBox.SelectionStart == 0) || (!Char.IsDigit(tTBox.Text.Substring(tTBox.SelectionStart - 1, 1), 0)) || (tTBox.Text.IndexOf(".") != -1)))
  7.                 e.Handled = true;
  8.         }

Вопрос почему обработчик отваливается через некоторое время, когда я даже не скажу, просто замечаю периодически что его уже нет. Если вызывает функцию другого класса.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Алексей Кулик от 19-02-2023, 20:48:08
Если вызывает функцию другого класса.
А этот другой класс статический?
Извините, вам запрещён просмотр содержимого спойлеров.
Название: Re: Оффтопик. Изучаем C#
Отправлено: alz от 20-02-2023, 07:06:48
А этот другой класс статический?
Из которого вызывается обычный, вызывается статический.
Название: Re: Оффтопик. Изучаем C#
Отправлено: Алексей Кулик от 20-02-2023, 08:52:47
Не понял, если честно. У тебя есть событие, которое обращается к методу статического класса (валидатору, так обзову). Валидатор в свою очередь обращается к методу второго класса. И вот этот второй класс - статический? Ну так, на всякий случай.
Название: Re: Оффтопик. Изучаем C#
Отправлено: alz от 20-02-2023, 08:58:27
Не понял, если честно. У тебя есть событие, которое обращается к методу статического класса (валидатору, так обзову). Валидатор в свою очередь обращается к методу второго класса. И вот этот второй класс - статический? Ну так, на всякий случай.
Событие напрямую обращается к валидатору в статическом классе.
Название: Re: Оффтопик. Изучаем C#
Отправлено: alz от 16-03-2023, 17:19:48
В общем разобрался в этом вопросе все дело в файле designer, если в нем есть хоть какие-то ссылки на другие классы, то при изменении элементов формы при перестроении файла все это удаляется, соответственно любые валидаторы находящиеся в других класса там использовать не получится, точнее получится, но до первого изменения чего-либо на форме, так что раньше я все обработчики закидывал в него, если они ссылались на функции внутри формы проблем не было.
Решением оказалось помещение обработчиков событий в основной код формы, отсюда ничего не удаляется:

Код - C# [Выбрать]
  1. using System;
  2. using System.Windows.Forms;
  3.  
  4. namespace Function
  5. {
  6.     public partial class Form1 : Form
  7.     {        
  8.         public Form1()
  9.         {
  10.             InitializeComponent();
  11.             Function function = new Function();
  12.             textBox1.KeyPress += new KeyPressEventHandler(function.TbKeyDoubleMinus);
  13.             textBox1.LostFocus += new EventHandler(function.TbLostFocus);
  14.         }
  15.     }
  16. }

Ну и может быть кому-то пригодится, класс с обработчиками, позволяет полностью контролировать ввод данных от пользователя, клавиша минус инвертирует число в текстбоксе, бекспейсом можно удалять выделенные фрагменты так же как и делитом.

Код - C# [Выбрать]
  1. using System;
  2. using System.Linq;
  3. using System.Windows.Forms;
  4.  
  5. namespace Function
  6. {
  7.     /// <summary>
  8.     /// События для управлением пользовательским вводом в текстбоксы
  9.     /// </summary>
  10.     internal class Function
  11.     {
  12.         /// <summary>
  13.         /// добавляет 0 к содержимому текстбокса если в нем нет чисел
  14.         /// используется при событии потери фокуса что бы в текстбоксе точно было число которое можно парсить      
  15.         /// </summary>
  16.         /// <param name="sender"></param>
  17.         /// <param name="e"></param>
  18.         public void TbLostFocus(object sender, EventArgs e)
  19.         {
  20.             TextBox tTB = sender as TextBox;
  21.             foreach (Char c in tTB.Text) if (Char.IsDigit(c)) return;          
  22.             tTB.Text += "0";
  23.         }
  24.         /// <summary>
  25.         /// это событие позволяет возможность вводить десятичные положительные и отрицательные числа
  26.         /// </summary>
  27.         /// <param name="sender"></param>
  28.         /// <param name="e"></param>
  29.         public void TbKeyDoubleMinus(object sender, KeyPressEventArgs e)
  30.         {
  31.             TextBox tTB = sender as TextBox;          
  32.             if (e.KeyChar == ',') e.KeyChar = '.';          
  33.             if (e.KeyChar == '-')
  34.             {
  35.                 int pos = tTB.SelectionStart;
  36.                 if (tTB.Text.Contains('-'))
  37.                 {
  38.                     tTB.Text = tTB.Text.Substring(1);
  39.                     tTB.SelectionStart = pos - 1;
  40.                 }
  41.                 else
  42.                 {
  43.                     tTB.Text = '-' + tTB.Text;
  44.                     tTB.SelectionStart = pos + 1;
  45.                 }
  46.                 e.Handled = true;
  47.                 return;
  48.             }
  49.             if (e.KeyChar == '.')
  50.             {
  51.                 if (tTB.Text.Contains('.') | (tTB.SelectionStart == 0 & tTB.Text.Contains('-'))) e.Handled = true;              
  52.                 return;
  53.             }
  54.             if (e.KeyChar == 8 )
  55.             {
  56.                 if (tTB.SelectionLength > 0)
  57.                 {
  58.                     int pos = tTB.SelectionStart;
  59.                     tTB.Text = tTB.Text.Substring(0, tTB.SelectionStart) + tTB.Text.Substring(tTB.SelectionStart + tTB.SelectionLength);
  60.                     tTB.SelectionStart = pos;
  61.                     e.Handled = true;
  62.                 }                
  63.                 return;
  64.             }
  65.             if (Char.IsDigit(e.KeyChar))
  66.             {
  67.                 if (tTB.Text.Contains('-') & tTB.SelectionStart == 0) e.Handled = true;
  68.                 return;
  69.             }
  70.             e.Handled = true;
  71.         }
  72.         /// <summary>
  73.         /// это событие позволяет вводить десятичные положительные числа
  74.         /// </summary>
  75.         /// <param name="sender"></param>
  76.         /// <param name="e"></param>
  77.         public void TbKeyDouble(object sender, KeyPressEventArgs e)
  78.         {
  79.             TextBox tTB = sender as TextBox;
  80.             if (e.KeyChar == ',') e.KeyChar = '.';
  81.             if (e.KeyChar == '.')
  82.             {
  83.                 if (tTB.Text.Contains('.') | (tTB.SelectionStart == 0 & tTB.Text.Contains('-'))) e.Handled = true;
  84.                 return;
  85.             }
  86.             if (e.KeyChar == 8)
  87.             {
  88.                 if (tTB.SelectionLength > 0)
  89.                 {
  90.                     int pos = tTB.SelectionStart;
  91.                     tTB.Text = tTB.Text.Substring(0, tTB.SelectionStart) + tTB.Text.Substring(tTB.SelectionStart + tTB.SelectionLength);
  92.                     tTB.SelectionStart = pos;
  93.                     e.Handled = true;
  94.                 }
  95.                 return;
  96.             }
  97.             if (Char.IsDigit(e.KeyChar))
  98.             {
  99.                 if (tTB.Text.Contains('-') & tTB.SelectionStart == 0) e.Handled = true;
  100.                 return;
  101.             }
  102.             e.Handled = true;
  103.         }
  104.         /// <summary>
  105.         /// это событие позволяет вводить целые положительные и отрицательные числа
  106.         /// </summary>
  107.         /// <param name="sender"></param>
  108.         /// <param name="e"></param>
  109.         public void TbKeyIntegerMinus(object sender, KeyPressEventArgs e)
  110.         {
  111.             TextBox tTB = sender as TextBox;            
  112.             if (e.KeyChar == '-')
  113.             {
  114.                 int pos = tTB.SelectionStart;
  115.                 if (tTB.Text.Contains('-'))
  116.                 {
  117.                     tTB.Text = tTB.Text.Substring(1);
  118.                     tTB.SelectionStart = pos - 1;
  119.                 }
  120.                 else
  121.                 {
  122.                     tTB.Text = '-' + tTB.Text;
  123.                     tTB.SelectionStart = pos + 1;
  124.                 }
  125.                 e.Handled = true;
  126.                 return;
  127.             }
  128.             if (e.KeyChar == 8)
  129.             {
  130.                 if (tTB.SelectionLength > 0)
  131.                 {
  132.                     int pos = tTB.SelectionStart;
  133.                     tTB.Text = tTB.Text.Substring(0, tTB.SelectionStart) + tTB.Text.Substring(tTB.SelectionStart + tTB.SelectionLength);
  134.                     tTB.SelectionStart = pos;
  135.                     e.Handled = true;
  136.                 }
  137.                 return;
  138.             }
  139.             if (Char.IsDigit(e.KeyChar))
  140.             {
  141.                 if (tTB.Text.Contains('-') & tTB.SelectionStart == 0) e.Handled = true;
  142.                 return;
  143.             }
  144.             e.Handled = true;
  145.         }
  146.         /// <summary>
  147.         /// это событие позволяет вводить целые положительные числа
  148.         /// </summary>
  149.         /// <param name="sender"></param>
  150.         /// <param name="e"></param>
  151.         public void TbKeyInteger(object sender, KeyPressEventArgs e)
  152.         {
  153.             TextBox tTB = sender as TextBox;
  154.             if (e.KeyChar == 8)
  155.             {
  156.                 if (tTB.SelectionLength > 0)
  157.                 {
  158.                     int pos = tTB.SelectionStart;
  159.                     tTB.Text = tTB.Text.Substring(0, tTB.SelectionStart) + tTB.Text.Substring(tTB.SelectionStart + tTB.SelectionLength);
  160.                     tTB.SelectionStart = pos;
  161.                     e.Handled = true;
  162.                 }
  163.                 return;
  164.             }
  165.             if (Char.IsDigit(e.KeyChar))
  166.             {
  167.                 if (tTB.Text.Contains('-') & tTB.SelectionStart == 0) e.Handled = true;
  168.                 return;
  169.             }
  170.             e.Handled = true;
  171.         }
  172.     }
  173. }
  174.  
Название: Re: Оффтопик. Изучаем C#
Отправлено: avc от 17-02-2024, 13:47:06
Изучаю .Net8. Это сильно кастрированая система, в ней часть старых функций приходится докачивать как nuget пакеты. Вопрос в том, как заставить Студию из этих пакетов вытащить только нужные dll и скопировать в папку плагина? И как заставить программу на компьтерах пользователей находить эти dll в папке плагина (просто положить рядом с основной dll не помогает)? Или может есть еще варианты, как лучше передавать пользователям эти nuget?
Название: Re: Оффтопик. Изучаем C#
Отправлено: Алексей Кулик от 17-02-2024, 15:49:03
как заставить Студию из этих пакетов вытащить только нужные dll и скопировать в папку плагина?
Насколько я знаю никак
как заставить программу на компьтерах пользователей находить эти dll в папке плагина (просто положить рядом с основной dll не помогает)?
AssemblyResolve или ее альтернативы, которые на форуме болтались - это если говорить про ACAD-дополнения.
Или может есть еще варианты, как лучше передавать пользователям эти nuget?
NuGet имеет смысл, как мне кажется, только для разработчика. Пользователям инсталлер подавай ;)
Название: Re: Оффтопик. Изучаем C#
Отправлено: avc от 17-02-2024, 17:08:36
Спасибо. Я наивно надеялся, что MS придумали эти странные пакеты, чтоб они сами ставились у пользователей по первому обращению. Я даже заметил, что Студия создает странный скрипт (json) с перечислением пакетов в папке рядом с dll. Но чуда не свершилось и скрипт этот не запускается  :(
Значит буду подбирать методом тыка какие dll нужны ( уж больно их там много в каждом пакете)... Вот жеж придумали MS геморрой...