Регистрация не е нужна, освен при създаване на тема в "Задача на седмицата".

Въпрос

Въпрос

Мнениеот Гост » 30 Окт 2022, 09:14

Здравейте!
Във Visual Studio имам създадено приложение на Windows Forms App (Visual Basic).
Искам това приложение да го създам и на Windows Forms App (C#).
Как да преобразувам кода? Възможно ли е?
Untitled.jpg
Untitled.jpg (130.32 KiB) Прегледано 581 пъти
Гост
 

Re: Въпрос

Мнениеот ammornil » 30 Окт 2022, 14:11

Транслатори на код между Майкрософт програмни езици не са нещо ново, но кодът за транслация трябва да отговаря на определени изисквания за да може да се "прекара" през транслатор. Кодът за транслация и настройката на транслатора трябва да са в съвместими версии на .Net , някои синтактични изключения не се транслират коректно и трябва да се донаглясят, и най-важното: някои обекти от един език може да нямат еквивалент в другия а да използват напълно различна (заобиколна) логика, което означава че някои по-прости транслатори няма да ги трансформират изобщо. В много случаи крайният код макар и ефективен, не е ефикасен, защото решенията на аналогични проблеми в различни езици може да имат различна степен на ефикасност.

За нещо не много сложно, може и да сработи коректно, но според мен ако не е много сложно, е по-лесно да се напише в другия език, отколкото да се транслира и после да се рефакторира (моля за извинение за чуждицата, но не знам термина на български).

Освен това, ако целта Ви е да научите C#, аз бих препоръчал да си напишете кода за да видите лексиката и синтаксиса на езика, както и да се запознаете с основните библиотеки. Българската компания Телерик има професионални решения за конвертиране на код между различни езици на Майкрософт ( ДЕМО ), който може да Ви помогне да намерите вения подход, но Ви препоръчвам да пишете кода за себе си, вместо автоматично да го трансформирате. При всички случаи, за да потвърдите верността и ефективността на кода, трябва да имате поне основна представа от C#.

Съществуват много други, но не мога да кажа до колко са успешни в репродукцията на кода. Надявам се това да Ви е от полза.

Забележка (педантичността ми е порок): В горепосочения код, в съобщението за грешка, трябва да бъде "Елементът се дублира", с пълен член (мъжки род, подлог).
[tex]\color{lightseagreen}\text{''Който никога не е правил грешка, никога не е опитвал нещо ново.''} \\
\hspace{21em}\text{(Алберт Айнщайн)}[/tex]
Аватар
ammornil
Математик
 
Мнения: 3767
Регистриран на: 25 Май 2010, 19:28
Местоположение: Великобритания
Рейтинг: 1779

Re: Въпрос

Мнениеот Sup3rlum » 30 Окт 2022, 17:13

Колегата горе е писал по-обширно за транслатори за код и т.н. Транслаторите за код са нещо което със сигурност съществува и си намира употреба, но аз по-скоро ще покажа как да си го направиш сам.

Visual Basic и C# се компилират за една и съща платформа - .NET на Microsoft. Това означава, че притежават почти максимална интероперативност и библиотеки писани на единия език са използваеми и в другия (под капака се компилират на един и същи IR bytecode).
Още повече, че Microsoft са се постарали да им направят синтактичната структура доста подобна.
Това което остава е да знаеш кое как се отнася между езиците.

Първо, резервираните ключови думички в C# са с малки букви, и често скъсени: Private -> private, Object -> object, Boolean -> bool и т.н.
Второ, блоковете код в C# се ограждат с къдрави скоби {}, вместо лингвистичното Sub ... End Sub, If End If
Трето, сигнатурите на определени изрази са малко променени: If <condition> Then <statement> -> if (<condition>) { <statement> }, For x To n-1 -> for (int x=0; x<n;x++), <variable> As <type> -> <type> <variable>
Четвърто, в края на всеки съставен от изрази ред на C# се слага ";", т. нар. trailing semicolon
Пето, за логическите оператори се използват техните съотвестващи логически знаци: Not -> ! , And -> &&, Or -> || и т.н.
Шесто, функциите пр липса на тип стойност на връщане, се пишат с тип void

Ако приложиш тези правила в крайна сметка получаваш:

Код: Избери целия код

        private void btnAdd_Click(object sender, EventArgs e)
        {
            if (btnAdd.Text = "Доабавяне на запис")
            {
                bool f = false; // Декларацията и задаване на стойност става вече на един ред
                for (int i = 0; i < ListBox1.Items.Count; i++) // Еквивалентно на For ... To ..
                {
                    if (ListBox1.Items[i] == txtInput.Text)
                    {
                        f = true;
                        break;
                    }
                }

                if (!f)
                {
                    ListBox1.Items.Add(textInput.Text);
                }
                else
                {
                    MessageBox.Show("Елементът се дублира!", "Грешка при добавяне", 0, MessageBoxIcon.Error);
                }

                txtInput.Text = "";
                txtInput.Focus();

                if (ListBox1.Items.Count > 0)
                {
                    btnClear.Enabled = true;
                }

            }
            else
            {
                ListBox1.Items[ListBox1.SelectedIndex] = txtInput.Text;
                txtInput.Text = "";
                ListBox1.SelectedIndex = -1;
                btnAdd.Text = "Добавяне на запис";
            }

        }



Тук ако обърнеш внимание съм пропуснал да спомена какво се прави с това Handles btnAdd.Click. Това в C# не се използва директно на функцията, а се генерира от GUI designer-a на Visual Studio. За целта трябва да отидеш на event-ите на сами обект и да намериш Click(), и там да посочиш името на тази функция.
Sup3rlum
Фен на форума
 
Мнения: 247
Регистриран на: 19 Фев 2019, 02:08
Рейтинг: 347


Назад към C#, Java



Кой е на линия

Регистрирани потребители: Google Adsense [Bot], Google [Bot]

Форум за математика(архив)