C#. — Перевести C# код на Pascal


Содержание

C#. — Перевести C# код на Pascal

286 просмотра

1 ответ

13 Репутация автора

У меня есть c ++ dll, который используется в проекте delphy pascal, и я хочу создать проект ac # для его использования. DLL возвращает интерфейсный объект, и я сейчас застрял на том, как реализовать интерфейс C #, который будет распознаваться dllImport. У меня есть код на паскале, который работает. Кроме того, у меня нет доступа к источнику C ++ DLL.

вот дельфи часть:

Я написал это в моем проекте C # до сих пор

Я получаю различные ошибки относительно неправильного определения PInvoke или:

Ответы (1)

плюса

361806 Репутация автора

Короче говоря, ваша DLL не совместима как есть с C #.

Интерфейсы Delphi нельзя использовать в C #, если:

они происходят из IInterface (известный как IUnknown в COM), и вы используете взаимодействие COM на стороне C #.

вы подделываете интерфейс на стороне C #, объявляя структуру в стиле C, которая содержит указатель на vtable (массив указателей на функции в стиле C) для методов интерфейса. И тогда вы можете использовать указатель на эту внешнюю структуру везде, где ожидается интерфейс Delphi.

Кроме того, два типа ваших событий, ReceiveDataEvent и ListRecive , используют специфичную для Delphi функцию ( procedure of object ), которая вообще не совместима с C #, поэтому использование вами делегатов не будет работать для них. Либо используйте указатели функций в стиле C, либо интерфейс событий в стиле COM.

Динамические массивы в стиле Delphi, например TIdBytes , также вообще не совместимы с C # или даже с COM. Вместо этого вам нужно использовать статические массивы, динамические массивы в стиле C или COM SafeArrays.

Кроме того, ошибка в вашем коде заключается в том, что DLL использует stdcall соглашение о вызовах, но cdecl вместо этого используется ваш импорт C # .

Короче говоря, вы должны действительно переделать DLL, прежде чем вы сможете использовать ее непосредственно в C #. Если это не вариант, то, по крайней мере, напишите обертку COM вокруг нее, а затем импортируйте ее в C #.

Преобразование Паскаль в C #

Я пытаюсь преобразовать этот код на паскале в C # для связи с периферийным устройством, подключенным к коммуникационному порту. Этот фрагмент кода должен вычислять контрольный байт, однако я не получаю правильное шестнадцатеричное значение, поэтому мне интересно, правильно ли я конвертирую код. Паскаль:

И последний паскаль:

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

Дополнительная информация РЕДАКТИРОВАТЬ: Первоначально я отправляю последовательность строк, содержащую команду и информацию, которую должен распечатать принтер. Так как каждая последовательность имеет уникальный управляющий байт (в шестнадцатеричном формате), я должен вычислить это из последовательности (sequence = «P1; 1 $ l201PrinterPrinterPrinter1B / 100.00 / 100.00 / 0 / \»), что и делает верхний код в соответствии с POSNET => msgstr «cc — управляющий байт, закодированный как 2 шестнадцатеричные цифры (EXOR всех символов после ESC P в этот байт с начальным количеством # 255), согласно следующему алгоритму на языке PASCAL: (см. первый блок кода)». => 1. контрольный номер, вычисленный в вышеупомянутом цикле, который составляет управляющий байт, должен быть перекодирован в два символа HEX (символы ASCII из области видимости: ‘0’ .. ‘9’, ‘A’ .. ‘F’, ‘a’ .. ‘f’ ), используя следующую функцию byte_to_hex: (см. третий блок кода). => < * преобразование байта в 2 символа * > (см. 5-й блок кода)

1 ответ

Самая очевидная проблема, которую я вижу, состоит в том, что код Паскаля работает с 8-битными кодированными строками на основе 1, а код C # работает с 16-битными кодированными строками на основе 0. Чтобы преобразовать код Pascal / Delphi, который вы используете, в C #, вам нужно устранить несоответствие. Возможно, вот так:

Теперь, чтобы написать это, мне пришлось сделать немало предположений, потому что вы не включили в вопрос достаточно мало кода. Вот что я предположил:

  1. Переменная sequence Паскаля представляет собой 1-разрядную 8-битную кодировку ANSI Delphi AnsiString .
  2. Контрольная переменная Паскаля представляет собой 32-разрядное Integer Delphi.
  3. Переменная sequence C # является string C #.

Если какое-либо из этих предположений окажется ложным, приведенный выше код не принесет пользы. Например, возможно, check Паскаля действительно Byte . В этом случае я думаю, код C # должен быть:

Я надеюсь, что это убеждает вас в важности предоставления полной информации.


Вот и все главное в этом вопросе. Остальная часть кода касается преобразования значений в шестнадцатеричные строки в коде C #. Это снова и снова освещалось здесь, на переполнении стека. Например:

Является ли код C# свободно конвертируемым в C++?

Теоретически, можно С# проект откомпилировать, сборку разобрать рефлектором с плагином c++/CLI, полученные исходники допилить напильником.

1) Use C# to script in Unreal Engine 4 now, courtesy of Xamarin.
2) https://mono-ue.github.io.

Сам не пробовал, но знакомые (разработчики игр на UE 4) говорят что есть плагин для этого дела.
На Unity3D например, этого C# надо не так много надо, в основном сложности идут по Unity3D прибомбасам (в моем случае).

C#. — Перевести C# код на Pascal

Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда — alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Форум программистов > Технологии > Помощь студентам
перевести программу с языка C# на язык Pascal
Регистрация
Поиск по форуму
Расширенный поиск
К странице.

Здесь нужно купить рекламу за 25 тыс руб в месяц! ) пишите сюда — alarforum@yandex.ru

________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!

25.11.2012, 03:03 #1

во-первых, приказывать здесь не надо!

во-вторых, Pascal — Pascal’ю — рознь! У Вас какой?

перевести небольшой код с Pascal в C++

Здраствуйте.
Имеется код на Pascal:

Попытался его перевести в C++:

Помогите исправить мои ошибки. Спасибо.

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

ну вот небольший тестик :

25.11.2012, 03:29 #2
Цитата(mes @ 20.12.2008, 01:09)
а тут помойму чем дословный перевод делать, легче заново написать ..

Ну вот, опять мне понадобилась Ваша помощь.
Не буду создавать сто тем с одной проблемой.
Ребят, имеются структуры(думаю стоит почитать мне книги)

Помогите перевести в C++
У меня получается ерунда, хотя пример покажите на первых дух структурах.
Только прошу не говорите, что не хочу сам переводить. Я пытался, но пока не получилось.
Переведите хотябы первые две структуры, а дальше сам попробую разобраться.

Программирование на C, C# и Java

Уроки программирования, алгоритмы, статьи, исходники, примеры программ и полезные советы

ОСТОРОЖНО МОШЕННИКИ! В последнее время в социальных сетях участились случаи предложения помощи в написании программ от лиц, прикрывающихся сайтом vscode.ru. Мы никогда не пишем первыми и не размещаем никакие материалы в посторонних группах ВК. Для связи с нами используйте исключительно эти контакты: vscoderu@yandex.ru, https://vk.com/vscode

Исходный код: треугольник Паскаля на C#


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

Треугольник Паскаля – это числовая бесконечная таблица, в которой по краям стоят единицы, а каждое число внутри равно двум стоящим над ним в ближайшей строке сверху.

лабы по информатике, егэ

лабораторные работы и задачи по программированию и информатике, егэ по информатике

Pascal: Занятие №2. Часть 1: Условный оператор в Паскале (If)

Условный оператор в Паскале

До рассмотрения данной темы в основном использовались линейные алгоритмы в Паскале, характерные для весьма простых задач, когда действия (операторы) выполняются последовательно, одно за другим. Более сложные алгоритмы предусматривают использование конструкция ветвления.

Блок-схема условного оператора:

Условный оператор в Паскале имеет следующий синтаксис:

if условие then оператор;

Полный вариант:

if условие then оператор else оператор;

Условный оператор в Паскале — if — служит для организации хода задачи таким образом, при котором изменяется последовательность выполнения операторов в зависимости от какого-либо логического условия. Логическое условие может принимать одно из двух значений: либо true (истина), либо false (ложь), соответственно, оно может быть либо истинным, либо ложным.

Составной оператор

Если при истинном условии необходимо выполнять несколько операторов, то их по правилам языка Pascal необходимо заключать в блок, начинающийся со служебного слова begin и заканчивающегося служебным словом end . Такой блок принято называть операторными скобками, а данную конструкцию — составным оператором:

Операторные скобки и составной оператор в Паскале:

if логическое выражение then begin оператор1; оператор2; end else begin оператор1; оператор2; end;

Перевод с английского оператора условия облегчит понимание его использования:

Вариант 1 Вариант 2

Подробно разобраться в работе условного оператора в Паскале можно, просмотрев видеоурок:

Обратите внимание на то, как в данном примере выводится y . При выводе переменных типа real в pascal, можно использовать так называемый форматированный вывод, или запись с двумя двоеточиями:
y:6:2
— цифра после первого двоеточия ( 6 ) указывает на то, сколько знаков будет занимать число при выводе на экран
— цифра после второго двоеточия ( 2 ) указывает на то, сколько знаков после запятой вещественного числа будет выводиться

Таким образом, использование такой записи в pascal практически позволяет выполнить округление до сотых, тысячных и т.п.

Логические операции в Паскале (в логическом выражении)

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

  • Логическая операция AND (И), поставленная между двумя условиями, говорит о том, что должны выполняться сразу оба эти условия (должны быть истинными). Логический смысл операции — «конъюнкция».
  • Поставленный между двумя условиями, знак OR (ИЛИ) говорит о том, что достаточно, если будет выполняться хотя бы одно из них (одно из двух условий истинно). Логический смысл операции — «дизъюнкция».
  • На языке Паскаль XOR — знак логической операции, имеющий смысл «строгая дизъюнкция» и указывающий на то, что необходимо, чтобы одно из двух условий выполнялось (истинно), а другое — не выполнялось (ложно).
  • Логическая операция NOT перед логическим выражением или переменной имеет смысл «отрицание» или «инверсия» и указывает на то, что если данная переменная или выражение истинны, то их отрицание — ложь и наоборот.

var n:integer; begin n:=6; if (n>5) and (n 7) or (n 7) xor (n 7) then writeln(‘истина’); end.


Вариант 1 Вариант 2

var a,b: integer; begin write(‘Введите A: ‘); read(a); b := a mod 2; if b>0 then writeln(‘true’) else writeln (‘false’) end.

Построение блок-схем по коду Паскаль

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

Существуют управляющие структуры трех типов:

следование ветвление повторение или цикл

Две из трех представленных структур блок-схемы мы уже можем перевести в код Pascal.

Преобразование Pascal в C#

Я пытаюсь преобразовать этот код pascal в C# для связи с периферийным устройством, подключенным к коммуникационному порту. Этот кусок кода должен вычислять контрольный байт, однако я не получаю правильное шестнадцатеричное значение, поэтому мне интересно, правильно ли я конвертирую код. Паскаль:

И последнее паскаль:

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

Дополнительная информация EDIT: Первоначально я отправляю последовательность строк, содержащую команду и информацию, которые принтер должен печатать. Поскольку каждая последовательность имеет уникальный контрольный байт (в Hex), я должен рассчитать это из последовательности (последовательность = «P1; 1 $ l201PrinterPrinterPrinter1B/100.00/100.00/0/\»), что и делает верхний код в соответствии с POSNET => «cc — управляющий байт, закодированный как 2 HEX-цифры (EXOR всех символов после ESC P до этого байта с начальным количеством 255), согласно следующему алгоритму в языке PASCAL: (см. первый блок кода)». => 1. проверочный номер, вычисленный в вышеуказанном цикле, который представляет собой контрольный байт, должен быть перекодирован на два символа HEX (символы ASCII из области действия: «0» .. «9», «A» .. «F», «a» .. ‘f’), используя следующую функцию byte_to_hex: (см. третий блок кода). => <* преобразование байта в 2 символа *> (см. Пятый кодовый блок)

Создан 03 окт. 14 2014-10-03 09:34:25 user1961008

Вы не говорите нам, что представляют собой типы данных. Мы понятия не имеем, является ли массив Pascal похожим на нуль или один на основе. И вы не говорите нам, какие входные данные вы используете. Ни то, что вы получаете. Рассматривали ли вы выполнение некоторой отладки? Это основной навык, который вы действительно должны приобрести. Либо используйте отладчики IDE, либо добавьте отладку трассировки. Разрабатывайте, где программы расходятся друг от друга. Затем исправьте проблему. Повторяйте, пока программы не будут вести себя одинаково. – David Heffernan 03 окт. 14 2014-10-03 09:38:43

Также обе функции преобразования в шестнадцатеричные строки являются ложными. Есть более простые способы сделать это, и библиотечные функции, по крайней мере, для Pascal. – David Heffernan 03 окт. 14 2014-10-03 09:43:22

Спасибо, Дэвид за ваш быстрый ответ. «Sequence» в цикле представляет собой строку «1; 1 $ l201PrinterPrinterPrinter1B/100.00/100.00/0 /», тогда как «check» преобразуется в строку и передается как параметр функции ControlByte, которая возвращает значение Hex. Что касается поддельности, я получил код паскаля в виде руководства Posnet для термических принтеров. Надеюсь, эта информация поможет понять проблему. – user1961008 03 окт. 14 2014-10-03 10:06:59

Предполагая, что последовательность Паскаля начинается с индекса 0, ‘для i: = 3 до длины (последовательности) -4′ следует перевести на’ for (int x = 3; x – xxa 03 окт. 14 2014-10-03 15:41:53

@xxa Строки Delphi/TurboPascal/FPC (традиционно) основаны на – David Heffernan 03 окт. 14 2014-10-03 20:09:49

@Dav (оба взяты из вопроса) не могут быть эквивалентны, поскольку последняя итерация короче. – xxa 03 окт. 14 2014-10-03 23:31:50

1 ответ

Наиболее очевидной проблемой, которую я вижу, является то, что код Pascal работает с 1-битной кодированной строкой, а C# код работает с 16-битными закодированными строками на основе 0. Чтобы преобразовать код Pascal/Delphi, который вы используете на C#, вам необходимо обратиться к неправильному совпадению. Возможно, как это:

Теперь для того, чтобы написать это, я должен был сделать немало предположений, потому что вы не включают в себя какой-либо достаточно кода в этом вопросе. Вот то, что я предполагал:

  1. sequence переменная Паскаль является 1 на основе 8 бит ANSI кодируется Delphi AnsiString .
  2. Переменная Pascal check — это 32-разрядная Delphi, подписанная Integer .
  3. Переменная C# sequence является C# string .

Если какое-либо из этих допущений окажется ложным, то код, указанный выше, не будет хорошим. Например, возможно, Pascal check действительно Byte . В этом случае я думаю, # код C должен быть:

Я надеюсь, что это убеждает вас о важности подачи полной информации.

Это действительно все мясо этого вопроса. Остальная часть кода касается преобразования значений в шестнадцатеричные строки в коде C#. Это было рассмотрено снова и снова здесь, в Stack Overflow. Например:

Есть много еще много таких вопросов.

Создан 03 окт. 14 2014-10-03 10:36:29 David Heffernan

Спасибо, Дэвид, я проверю типы кодирования. Все, что я хотел выбраться из этого вопроса, это знать, правильно ли я конвертирую Pascal в C#, так как это первый раз, когда я занимаюсь этим языком. – user1961008 03 окт. 14 2014-10-03 10:48:12

David, Ansi не работает на C#, тогда как Default дает мне тот же результат для переменной ‘check’, как и раньше. Однако мое предположение состоит в том, что функции word_to_hex в pascal и ControlByte в C# не эквивалентны, и там возникает проблема. – user1961008 03 окт. 14 2014-10-03 11:19:21


Соглашения о написании кода на C# (Руководство по программированию на C#) C# Coding Conventions (C# Programming Guide)

Соглашения о написании кода предназначены для реализации следующих целей. Coding conventions serve the following purposes:

Создание согласованного вида кода, позволяющего читателям сосредоточиться на содержимом, а не на структуре. They create a consistent look to the code, so that readers can focus on content, not layout.

Предоставление читателям возможности делать предположения, основанные на опыте, и поэтому быстрее понимать код. They enable readers to understand the code more quickly by making assumptions based on previous experience.

Упрощение процессов копирования, изменения и обслуживания кода. They facilitate copying, changing, and maintaining the code.

Предоставление лучших методик C#. They demonstrate C# best practices.

Майкрософт использует приведенные в этом разделе рекомендации для разработки примеров и документации. The guidelines in this topic are used by Microsoft to develop samples and documentation.

Соглашения об именах Naming Conventions

В коротких примерах, не содержащих директив using, рекомендуется использовать полные указания для пространства имен. In short examples that do not include using directives, use namespace qualifications. Если известно, что пространство имен импортировано в проект по умолчанию, не требуется указывать полные имена из этого пространства имен. If you know that a namespace is imported by default in a project, you do not have to fully qualify the names from that namespace. Полные имена, если они слишком длинные для одной строки, можно разбить после точки (.), как показано в следующем примере. Qualified names can be broken after a dot (.) if they are too long for a single line, as shown in the following example.

Нет необходимости изменять имена объектов, созданных с помощью инструментов разработки Visual Studio, чтобы привести их в соответствие с другими соглашениями. You do not have to change the names of objects that were created by using the Visual Studio designer tools to make them fit other guidelines.

Соглашения о расположении Layout Conventions

Чтобы выделить структуру кода и облегчить чтение кода, в хорошем макете используется форматирование. Good layout uses formatting to emphasize the structure of your code and to make the code easier to read. Примеры и образцы корпорации Майкрософт соответствуют следующим соглашениям. Microsoft examples and samples conform to the following conventions:

Использование параметров редактора кода по умолчанию (логичные отступы, отступы по четыре символа, использование пробелов для табуляции). Use the default Code Editor settings (smart indenting, four-character indents, tabs saved as spaces). Дополнительные сведения см. в разделе «Параметры», «Текстовый редактор», C#, «Форматирование». For more information, see Options, Text Editor, C#, Formatting.

Запись только одного оператора в строке. Write only one statement per line.

Запись только одного объявления в строке. Write only one declaration per line.

Если отступ для дополнительных строк не ставится автоматически, необходимо сделать для них отступ на одну позицию табуляции (четыре пробела). If continuation lines are not indented automatically, indent them one tab stop (four spaces).

Добавление по крайней мере одной пустой строки между определениями методов и свойств. Add at least one blank line between method definitions and property definitions.

Использование скобок для ясности предложений в выражениях, как показано в следующем коде. Use parentheses to make clauses in an expression apparent, as shown in the following code.

Соглашения о комментариях Commenting Conventions

Комментарий размещается на отдельной строке, а не в конце строки кода. Place the comment on a separate line, not at the end of a line of code.

Текст комментария начинается с заглавной буквы. Begin comment text with an uppercase letter.

Текст комментария завершается точкой. End comment text with a period.

Между разделителем комментария (/ /) и текстом комментария вставляется один пробел, как показано в следующем примере. Insert one space between the comment delimiter (//) and the comment text, as shown in the following example.

Вокруг комментариев не должно быть звездочек. Do not create formatted blocks of asterisks around comments.

Рекомендации по работе с языком Language Guidelines

В следующих подразделах описаны методики, которыми руководствуется команда C# для подготовки примеров и образцов кода. The following sections describe practices that the C# team follows to prepare code examples and samples.

Тип данных String String Data Type

Для сцепления коротких строк рекомендуется использовать интерполяцию строк, как показано в следующем коде. Use string interpolation to concatenate short strings, as shown in the following code.

Для добавления строк в циклы, особенно при работе с текстами больших размеров, рекомендуется использовать объект StringBuilder. To append strings in loops, especially when you are working with large amounts of text, use a StringBuilder object.

Неявно типизированные локальные переменные Implicitly Typed Local Variables


В случаях, когда тип переменной понятен из правой части назначения или когда точный тип не важен, рекомендуется использовать неявное типизирование для локальных переменных. 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.

Если тип из правой части назначения не является очевидным, не рекомендуется использовать var. Do not use var when the type is not apparent from the right side of the assignment.

При указании типа переменной не следует полагаться на имя переменной. Do not rely on the variable name to specify the type of the variable. Имя может быть неверным. It might not be correct.

Рекомендуется избегать использования var вместо dynamic. Avoid the use of var in place of dynamic.

Рекомендуется использовать неявное типизирование для определения типа переменной цикла в циклах for и foreach. Use implicit typing to determine the type of the loop variable in for and foreach loops.

В следующем примере неявное типизирование используется в операторе for . The following example uses implicit typing in a for statement.

В следующем примере неявное типизирование используется в операторе foreach . The following example uses implicit typing in a foreach statement.

Беззнаковый тип данных Unsigned Data Type

  • Как правило, рекомендуется использовать int вместо беззнаковых типов. In general, use int rather than unsigned types. В C# обычно используется int . Использование int упрощает взаимодействие с другими библиотеками. The use of int is common throughout C#, and it is easier to interact with other libraries when you use int .

Массивы Arrays

При инициализации массивов в строке объявления рекомендуется использовать сокращенный синтаксис. Use the concise syntax when you initialize arrays on the declaration line.

Делегаты Delegates

Для создания экземпляров типа делегата рекомендуется использовать сокращенный синтаксис. Use the concise syntax to create instances of a delegate type.

Операторы try-catch и using в процессе обработки исключений try-catch and using Statements in Exception Handling

Рекомендуется использовать оператор try-catch для обработки большей части исключений. Use a try-catch statement for most exception handling.

Использование оператора C# using упрощает код. Simplify your code by using the C# using statement. При наличии оператора try-finally, код которого в блоке finally содержит только вызов метода Dispose, вместо него рекомендуется использовать оператор using . If you have a try-finally statement in which the only code in the finally block is a call to the Dispose method, use a using statement instead.

Операторы && и || && and || Operators

Чтобы избежать возникновения исключений и увеличить производительность за счет пропуска необязательных сравнений, рекомендуется использовать && вместо & и || вместо | при выполнении сравнений, как показано в следующем примере. To avoid exceptions and increase performance by skipping unnecessary comparisons, use && instead of & and || instead of | when you perform comparisons, as shown in the following example.

Оператор New New Operator

Рекомендуется использовать сокращенную форму создания экземпляра для объекта с неявным типизированием, как показано в следующем объявлении. Use the concise form of object instantiation, with implicit typing, as shown in the following declaration.

Предыдущая строка соответствует следующему объявлению. The previous line is equivalent to the following declaration.

Рекомендуется использовать инициализаторы объектов для упрощения создания объектов. Use object initializers to simplify object creation.

Обработка событий Event Handling

При определении обработчика событий, которого не требуется удалять позднее, рекомендуется использовать лямбда-выражение. If you are defining an event handler that you do not need to remove later, use a lambda expression.

Статический члены Static Members

  • Для вызова статических членов следует использовать имя класса: ClassName.StaticMember. Call static members by using the class name: ClassName.StaticMember. В этом случае код становится более удобочитаемым за счет четкого доступа. This practice makes code more readable by making static access clear. Не присваивайте статическому члену, определенному в базовом классе, имя производного класса. Do not qualify a static member defined in a base class with the name of a derived class. Во время компиляции кода его читаемость нарушается, и если добавить статический член с тем же именем в производный классе, код может быть поврежден. While that code compiles, the code readability is misleading, and the code may break in the future if you add a static member with the same name to the derived class.


Запросы LINQ LINQ Queries

Используйте значимые имена для переменных запроса. Use meaningful names for query variables. В следующем примере используется seattleCustomers для клиентов, находящихся в Сиэтле. The following example uses seattleCustomers for customers who are located in Seattle.

Рекомендуется использовать псевдонимы для уверенности в том, что в именах свойств анонимных типов верно используются прописные буквы при помощи правил использования прописных и строчных букв языка Pascal. Use aliases to make sure that property names of anonymous types are correctly capitalized, using Pascal casing.

Переименуйте свойства, если имена свойств в результате могут быть неоднозначными. Rename properties when the property names in the result would be ambiguous. Например, если запрос возвращает имя клиента и идентификатор распространителя, не оставляйте имена в виде Name и ID , а переименуйте их, чтобы было ясно, что Name — имя клиента и ID — идентификатор распространителя. For example, if your query returns a customer name and a distributor ID, instead of leaving them as Name and ID in the result, rename them to clarify that Name is the name of a customer, and ID is the ID of a distributor.

Рекомендуется использовать неявное типизирование в объявлении переменных запроса и переменных диапазона. Use implicit typing in the declaration of query variables and range variables.

Выравнивайте предложения запроса под предложением from, как показано в предыдущих примерах. Align query clauses under the from clause, as shown in the previous examples.

Чтобы гарантировать, что более поздние предложения запроса работают с ограниченным, отфильтрованным набором данных, используйте предложение where перед другими предложениями запроса. Use where clauses before other query clauses to ensure that later query clauses operate on the reduced, filtered set of data.

Используйте несколько предложений from для доступа к внутренним коллекциям вместо предложения join. Use multiple from clauses instead of a join clause to access inner collections. Например, коллекция объектов Student может содержать коллекцию результатов тестирования. For example, a collection of Student objects might each contain a collection of test scores. При выполнении следующего запроса возвращаются результаты, превышающие 90 балов, а также фамилии учащихся, получивших такие оценки. When the following query is executed, it returns each score that is over 90, along with the last name of the student who received the score.

Безопасность Security

Следуйте указаниям, изложенным в правилах написания безопасного кода. Follow the guidelines in Secure Coding Guidelines.

Начинающим C# программистам: 5 полезных советов, которые сделают ваш код чище

Рассказывает Мош Хамедани, автор курсов по C# и AngularJS на udemy

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

Многие студенты моего базового курса по С# присылают мне свой код, и, когда у меня есть возможность, я его просматриваю и даю полезные советы для улучшения их навыков программирования. При этом я заметил несколько часто встречающихся ошибок. В данной статье я пролью свет на подобные моменты и расскажу, как сделать ваш код более чистым и упростить жизнь людям, которые будут его поддерживать.

Проверяйте входные данные в первую очередь

Обратите внимание на данный отрезок кода:

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

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

Оператор else нужен далеко не всегда

Продолжая с кодом из предыдущего примера, если аргумент shape будет равен null, будет выброшено исключение, и тогда остаток метода точно не будет выполнен. Поэтому нет никакого смысла в добавлении else, который, кроме того, добавляет отступов к бо́льшей части кода. Такой код выглядит чище:

Обратите внимание на то, что код после оператора if не имеет дополнительных отступов.

Фигурные скобки?

Этот пункт является полностью субъективным. Одни разработчики любят фигурные скобки, другие нет. Я лично прошел через разные стадии. Тут нет однозначного мнения о том, как поступать правильно. Вы должны сами для себя решать, ставить фигурные скобки или опустить их. Давайте уберем фигурные скобки в нашем примере, и посмотрим как это выглядит:

Мне кажется, теперь код стал чище. А что вы думаете по этому поводу?

Обращайте внимание на названия идентификаторов

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

  • od: Что значит od? Очередной день? Оператор доставки? Опция доступа?
  • Button1_Click(): Что за Button1? И чем она отличается от Button2?
  • thisAs: А это что вообще такое?!

Используйте названия, которые будут без искажений передавать ваши идеи в коде.

Избегайте ненужных переменных

В 80-х годах прошлого века книги по программированию учили нас объявлять переменную по любому поводу. Посмотрите на этот кусок кода, который читает два числа с консоли и выводит максимальное из них:

У меня буквально глаза на лоб вылезли, когда я объявлял все эти переменные! В чем основная цель этого кода? Правильно — найти максимум двух чисел. Поэтому firstInput и secondInput, которые являются строками со считанным вводом пользователя, не являются полезными или нужными в этом коде. Всё, что нам надо — два числа. Временная строка, которую мы получаем из консоли в процессе, не является важной. Поэтому эти две переменные никак не улучшают данный код в плане читабельности, а только лишь добавляют лишнего шума. Мы можем считать ввод с консоли и преобразовать его в число одной строкой кода:

В общем, избегайте объявлений ненужных переменных. Используйте переменные для повышения читабельности кода, а не наоборот.

Если советы в данной статье показались вам слишком тривиальными, обратите внимание на статью с 10 полезными особенностями языка C#.

Также советуем вам ознакомиться со списком из 20 других программистов, которые дают полезные советы о программировании на C#.

Цукерберг рекомендует:  Портфолио digital-профессионала сапоги для сапожника
Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих