И произойдет ли исключение если написать так,Код - C# [Выбрать]
var lwp = dbObj as Polyline; // If a "lightweight" (or optimized) polyline
Александр любит объявлять переменные через var (такой стиль написания), к ошибке в данном случае это не приведет, но ИМХО это дурной тон.Да, соглашусь с Вами - это я пошел на поводу у ReSharper'а. Читать код конечно удобней, когда есть явное объявление типов, но как ни странно - я уже привык к var. Со временем (с опытом) конечно начну использовать оба варианта. Объявление через var иногда полезно и нужно (как например var dbObj в примере выше)
Код становиться намного понятнее, если тип переменной указан явно
А можно вопрос. Почему не возникает исключение в случае когда объект не полилиния?Как раз для этого используется оператор as. Смысл такой примерно - берем неявную переменную dbObj и пытаемся сделать ее явной (Polyline). Результат запишем в lwp. Если dbObj не является Polyline, то вместо исключения просто получим lwp == null.
Это возможно только на C# или на vb.net также возможно?Возможно (http://stackoverflow.com/questions/2450185/vb-net-equivalent-of-c-sharp-as)
И произойдет ли исключение если написать такДа, произойдет, если dbObj не окажется Polyline
Объявление через var иногда полезно и нужно (как например var dbObj в примере выше)не полезно и если внимательно посмотреть код на msdn, то это видно. Если вы заранее не знаете, какой объект автокада будете обрабатывать, то есть соответствующие родительские типы.
Смысл такой примерно - берем неявную переменную dbObj и пытаемся сделать ее явной (Polyline). Результат запишем в lwp. Если dbObj не является Polyline, то вместо исключения просто получим lwp == null.ИМХО, не такой. Оператор AS сравнит типы переменных и если они совпадут, то передаст в переменную lwp указатель на этот объект в памяти. Не совпадут, не передаст,
не полезноэмммм... не убедили ))
Оператор AS сравнит типы переменных и если они совпадут, то передаст в переменную lwp указатель на этот объект в памяти.Так я тоже самое написал, только простым языком )) А если не совпадут - то null
е полезно и если внимательно посмотреть код на msdn, то это видно. Если вы заранее не знаете, какой объект автокада будете обрабатывать, то есть соответствующие родительские типы.Вот интересные доводы и обсуждения на тему - http://habrahabr.ru/post/39231/
Вот интересные доводы и обсуждения на тему - http://habrahabr.ru/post/39231/Я пожалуй процитирую один из ответов в том топике:
Доводы нормальные, но надо понимать, что в Microsoft тоже не глупые люди работают, и если они что-то рекомендуют (или не рекомендуют) в отношении использования ИХ инструментов, то лучше прислушаться именно к ним.
Уверен, доводов у Microsoft не меньше, тот же Кшиштоф Квалина часто разбирает подобные спорные моменты.
Use implicit typing for local variables when the type of the variable is obvious from the right side of the assignment, or when the precise type is not importantТак что всё зависит от ситуации (и предпочтения microsoft тоже меняются)
Александр любит объявлять переменные через var (такой стиль написания), к ошибке в данном случае это не приведет, но ИМХО это дурной тон.ИХМО явное указание типа это рудимент. Код не надо читать на печатной бумаге - для этого есть IDE, которые раскрашивают, делают автоотступы и пр. для читаемости кода - не зря А. Ривилис, в каждом втором посте нового автора напоминает оформлять код соответствующим образом. Вывод типа давным давно успешно реализован - вот пример даже на web странице http://www.fssnip.net (http://www.fssnip.net) - (показывает тип при поднесении мыши к выражению любого примера). Явное задание типа - только разводит "типографию" и делает код менее универсальным. Да кое-где его лучше указать (например для лучшей работы интелисенса), но делать это повсеместно - это скорей результат дурного наследия C# от Си (имею в виду читаемость кода). Код должен не только описывать, но и показывать алгоритм задачи, а не "топить" Вас в типы и пр. второстепенную "мешуру" - хотя это конечно вопрос больше к синтаксису языка.
и trycast на vbИМХО. Лучше не тратить время на освоение VB.Net
Как же многого я не знаю, если абстрактно сравнить со школой, то даже букварь не освоил и уже хочу писать сочиненияПочитайте недавний спор в этой теме (http://adn-cis.org/forum/index.php?topic=1832.15) - ответы с 19 по 24 ;)
ИХМО явное указание типа это рудимент. Код не надо читать на печатной бумаге - для этого есть IDE, которые раскрашивают, делают автоотступы и пр. для читаемости кода - не зря А. Ривилис, в каждом втором посте нового автора напоминает оформлять код соответствующим образом. Вывод типа давным давно успешно реализован - вот пример даже на web странице http://www.fssnip.net - (показывает тип при поднесении мыши к выражению любого примера). Явное задание типа - только разводит "типографию" и делает код менее универсальным. Да кое-где его лучше указать (например для лучшей работы интелисенса), но делать это повсеместно - это скорей результат дурного наследия C# от Си (имею в виду читаемость кода). Код должен не только описывать, но и показывать алгоритм задачи, а не "топить" Вас в типы и пр. второстепенную "мешуру" - хотя это конечно вопрос больше к синтаксису языка.Не согласен. Несомненно, var - более компактная форма записи, но это удобство достигается, на мой взгляд, за счёт некоторой потери удобочитаемости.
Давайте честно - в Linq выражениях Вам как, мешает отсутствие типа? Или может алгоритм хуже виден? По моему наоборотВ моём предыдущем сообщении дана ссылка на пример целесообразного использования var - там как раз LINQ.
В совсем старых своих кодах на СИ - я для этой цели и Венгерскую нотацию использовал - но времена меняются...Времена могут и меняться, но проверенные временем решения используются до сих пор и, как мне кажется, будут ещё долго использоваться как раз таки в виду этой самой проверенности временем. Я в своих текущих C\C++ исходниках использую Венгерскую нотацию, принятую к использованию в MSDN, например в объявлениях и определениях экспортируемых функций. Такой подход существенно облегчает чтение как моих, так и чужих исходников на C\C++, использующих WinAPI.
Когда пишу на C#, Венгерскую нотацию не использую.Я про это и говорил с самого начала - явный тип это фишка (рудимент) которая себя отживает - т.к. идет непрерывное развитие языков и инструментария программирования. Были свои стандарты в процедурном программировании, где они сейчас. Да если писать на "проверенных временем решениях" естественно надо писать соблюдая те стандарты под которые они были разработаны. C# имеет особенность в том, что он уходит от "корней" от версии к версии все дальше с большой скоростью. Мой прогноз - максимум через 10 лет - в C# "стандартным" будет код без явного задания типа - и читаться он будет ни чуть не хуже.
з.ы. То Андрей - просто из любопытства - мне тоже, до сих пор, пару раз в год "приходиться" вспоминать и Cи и иногда даже ассемблер - но это в части работы совсем далекой от персооналок и автокада (на так сказать "настоящем харде"). Зачем Вам практически понадобились С++ и прямые WinApi (я так понимаю что ты имеешь в виду не вызов "единичных" функций - а именно написание как минимум модуля).1. Не всё то, что мне нужно, можно сделать на .NET. Например - хуки.
Я про это и говорил с самого начала - явный тип это фишка (рудимент) которая себя отживаетСпор из разряда какая религия лучше, но все-таки явное указание-правильный путь.
После этого меня окончательно перестали посещать мысли по оптимизации через низкоуровневый кодТам, где я использую C\C++ - это делается не для оптимизации, но либо для защиты интеллектуальной собственности, либо для выполнение тех операций, которые мне не удалось выполнить при помощи .Net.
Транслятор IL реализован очень качественно, используя всю мощь MMXов и пр. расширений на уровне процессора - которые в рукопашную реализовать ой как не просто.Я в курсе. Джеффри Рихтер об этом писал в одной (а может и не одной) из своих книг, сообщая, что управляемый код по скорости работы почти не уступает неуправляемому именно за счёт того, что JIT по максимуму учитывает возможности текущего процессора, в то время как неуправляемый, статически скомпилированный код, ориентирован на среднестатистический процессор (дабы мог исполняться на любой машине). За счёт этого нивелируется время, единожды потраченное на JIT.
Оно вам надо каждый раз просматривая код подсознательно угадывать какой тип будет возвращен?Я пишу ровно про это, но с другой стороны - я вообще не хочу смотреть какие типы там вернутся - тип это проблема компилятора - программист должен думать об алгоритме задачи, а не о том через какие там типы это "вывернется". Перепишите логику любого sql запроса больше 5-ти строк на си - ставь типы или нет - понять действие будет очень тяжело - проблемы не в типах, а отсутствии выразительности (декларативности) языка - если у языка нормальная выразительность - явно заданные типы однозначно только мешают как восприятию, так и "сужают" универсальность кода.
проблемы не в типах, а отсутствии выразительности (декларативности) языкапишите не на языке, а с помощью языка и проблем с выразительностью станет меньше.
явно заданные типы однозначно только мешают как восприятию, так и "сужают" универсальность кодатип не важен?
пишите не на языке, а с помощью языка и проблем с выразительностью станет меньше.Да нет у меня проблем с выразительностью. Что такое писать не на языке а с помощью языка - я не понял - "проставьте типы" что Вы имели в виду?
суп = сварить(вода, петрушка, картошка, лук);
Да ужасный это псевдоязык где можно грызуна в суп засунуть - не надо на таком писать. Не надо принимать выразительность тем, что вы можете назвать любой объект петрушка.проблемы не в типах, а отсутствии выразительности (декларативности) языка
Да нет у меня проблем с выразительностью
Если подвести итог, тип нужен в си подобных языках (и даже в C# на текущем уровне), но причина этому - не "полезность" аннотации типа, а отсутствие (нахождение их в зачаточном виде) средств декларативного программирования - вот и приходится выражать программу в типах, чтоб можно было хоть как-то понять что пытался сделать программист.
может хватит сферического коня в вакууме рассматривать? :)пожалуй смысла нет)
Это значит, что четко сформулированный код будет одинаково хорошо "Выразителен" на разных языках и дело тут не в "отсутствии выразительности (декларативности) языка", "var" и т.д.Ну так я еще раз попрошу - если все равно на чем писать - напишите на C# sql запрос, или опишите на нем-же web страницу - помогут Вам типы?
Видимо не было задач, связанных с обработкой больших массивов данных?Не путайте динамическую типизацию и автоматический вывод типа - автоматом выведен тип или задан вручную - скомпилированно будет одно и то-же.
Ну если Вы считаете что Вы больший "ас" по эффективному решению "больших данных" можем и посоревноваться на бутыль коньяка - каждый пишет как хочет и на чем хочет :) .
каждый пишет как хочет и на чем хочетИ думается мне, что использован будет не C#, а что-то типа F# и функциональный подход, а там с типами и с Var-ами совсем все по другому =о)
Перепишите логику любого sql запроса больше 5-ти строк на си - ставь типы или нет - понять действие будет очень тяжело - проблемы не в типах, а отсутствии выразительности
Ну так я еще раз попрошу - если все равно на чем писать - напишите на C# sql запрос, или опишите на нем-же web страницу - помогут Вам типы?
Я пишу ровно про это, но с другой стороны - я вообще не хочу смотреть какие типы там вернутся - тип это проблема компилятора - программист должен думать об алгоритме задачи, а не о том через какие там типы это "вывернется". Перепишите логику любого sql запроса больше 5-ти строк на си - ставь типы или нет - понять действие будет очень тяжело - проблемы не в типах, а отсутствии выразительности (декларативности) языка - если у языка нормальная выразительность - явно заданные типы однозначно только мешают как восприятию, так и "сужают" универсальность кода.
Ну если Вы считаете что Вы больший "ас" по эффективному решению "больших данных" можем и посоревноваться на бутыль коньяка - каждый пишет как хочет и на чем хочет :)
В чем проблема понятно описать запрос?Да в том что его там не описать - никак, (ну с запросом еще можно выкрутиться - и сказать что Вот есть LINQ, с натяжкой это можно принять за ответ, но что, например, делать с web страницей). Вы на императивном языке можете описать "белеберду" из действий, в которой - даже Вы сами потом будете с карандашом разбираться. А как Вы написанный Вами запрос на сервер отправите? А его-же Вы сможете к csv файлу применить? Нет - Вам будет необходимо вводить дополнительный язык DSL (или воспользоваться существующим). Но в любом случае, он будет "вылезать" за рамки вашего Си (он не для того предназначен). Так вот в DSL'ах конечно можно прикрутить типы - но никто это в здравом уме делать не будет (на практике такого нет), но алгоритм читаться будет многократно четче - собственно Вы его этим языком и описываете - вынося реализацию за скобки. Аннотация типа - это аппендицит идущий еще от ассемблера (хоть там и нету явных типов - а все есть данные, включая код, но он очень "жестко" отреагирует если Вы случайно "запустите данные" - хотя случайно - не получится - ибо на то есть защита на уровне процессора - но это все отдельная история) задача которого объяснить компьютеру "физический" смысл данных. В хаскеле даже булевый тип описан средствами самого языка, без ссылок на "компьютерный" бит - и ничего - прекрасно работает.
но что, например, делать с web страницейто же что и в любом языке, либо оставить в коде и получить нечитабельный код, либо вынести в отдельный файл, тот же html и подгружать отдельно. В итоге редактируете html редактором, имеете подсветку тегов и т.д. Например так сделано в ASP.NET.
Вы на императивном языке можете описать "белеберду" из действий, в которой - даже Вы сами потом будете с карандашом разбираться. А как Вы написанный Вами запрос на сервер отправите?...ммм основной код будет "очень сложным", типа такого
Аннотация типа - это аппендицит идущий еще от ассемблера.Если бы был опыт, то не писали про ненужность типов.
Вы первые начали выдвигать предположения, что это у меня от недостатка опыта в определенных сегментах.
то же что и в любом языке, либо оставить в коде и получить нечитабельный код, либо вынести в отдельный файл..Любом котором Вы знаете, например на лиспе пример с http://www.racket-lang.org/ (http://www.racket-lang.org/):
#lang web-server/insta
;; A "hello world" web server
(define (start request)
(response/xexpr
'(html
(body "Hello World"))))
И самая суть в том, что лисп это никак не язык для описания Web страниц, это язык на котором можно описать любую семантику средствами самого языка (не путать с синтаксисом - например C# и VB.Net - это один и тот-же язык, вполне допускаю, что оба компилятора рождаются в Microsoft из одного проекта, они отличаются только синтаксисом - то есть "названием" ключевых слов и правилами разметки).покажите мне Вашу реальную задачку где вам понадобился массив на 100 000 000 индексовчтение LAS файла, созданного воздушным лазерным сканированием.
типом выведенным компиляторомвстречный вопрос, как компилятор угадает тип?
Тип угадает по применению - ищи алгоритм Хиндли - Минлера - это база сейчас уже более продвинутые.Point3d[] pointArrаy = new Point3d[1000000];
з.ы. То есть, получается, Вы ничего не знали о том что такое вывод типа - но активно писали что тип надо обязательно указывать.
А что для чтения LAS без массива никак? Я не готов вчитываться в мануал в ненужую мне задачу - конкретизируйте - почему там необходимо пременить массив (то есть считать или "развернуть" все (ну или достаточно большую часть) данных в память одновременно) - что Вы делаете (какое преобразование) с данными этого формата? Я слабо верю что их нельзя проиндексировать или просто выполнить последовательное преобразование.Задачи были разные, вырезка по произвольному контуру, построение внешнего контура облака точек, визуализация облака.
Приведите пример кода с созданием массива по алгоритму Хиндли - Минлера.Вы сейчас бред написали - алгоритм Хиндли - Минлера не создает массив. Он определяет его тип - по применению - то есть если потом к этому массиву применяется метод который ожидает Point3D - а это можно определить на этапе компиляции - то компилятор понимает что в этом массиве храняться именно Point3d - и проставляет ему соответствующий тип, если -же вы переделаете программу и вместо точек там будут обрабатываться, например ObjectId - конструктору массива будет присвоен соответствующий тип.
Он определяет его тип - по применению - то есть если потом к этому массиву применяется метод который ожидает Point3D.....хм опять тип, и как это связано с?
Аннотация типа - это аппендицит идущий еще от ассемблераследующий этап на пути к "Dream language", как избавиться от типа в методе?
Есть еще обобщенные методы - это когда Вы пишите функцию один раз - а их создается по количеству вызывов с уникальной перегрузкой входных типов - примеры ищите сами, а то я не очень понимаю людей которые вначале спорят, выствляя из себя опытных специалистов по данному вопросу, а потом просят привести примеры азов.....хм что-то не помню что обсуждали обобщенные методы.
По второму вопросу - а что у нас точки в видеокарту только разом загружаются? Или по контуру нельзя отсеять только необходимые точки последовательно.задачи расписывать не вижу смысла, не отклоняйтесь от темы декларативности языка ;-)