Приветствую Вас, Гость

Меню

Форма входа

Войти через соцсеть:

Уроки
Урок 1. Как написать программу на C#
Урок 2. Что такое элементы, свойства и события и как с ними работать
Урок 3. Условный оператор if (ЕСЛИ). Операторы & (И) и | (ИЛИ)
---
Урок 1. Как написать приложение Android на C#

Статьи
Как быстро перейти с C++ на C#

Друзья сайта
  • Создайте сайт на uCoz бесплатно
  • MSDN - Руководство C#
  • MSDN - C# для школьников
  • PInvoke.Net - C# под WinAPI (DllImport'ы)

  • Статистика
    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0

     Каталог статей 
    Главная » Статьи » 2. C# и другие языки. MS .NET и другие платформы » C# и другие языки [ Добавить статью ]

    Как быстро перейти с С++ на C#
    C# реально имеет много достоинств, поэтому некоторые профи хотят перейти с С++ на C# . Казалось бы, эти языки вообще похожи, а уж если кто-то писал на С++ под .NET, то перейти на C# можно за полчаса...ну, в случае мегасложного проекта - за пару часов. Всего делов-то - прочесть про отличия этих языков и запомнить, а то, что у них одинаково, и читать незачем. Но вот проблема: про отличия С++ вообще, С++ под .NET и C# .- нигде толком, практично и коротко, без воды, не написано.
    Я даже получила ЛО на Ответах от одного программера, которому написала про эти отличия.
    Поэтому, возможно, кому-то пригодится моя статья об отличиях С++ под .NET и C#, такая, чтоб в ней были не теоретические рассуждения, а чтоб прочтя ее, программер С++ под .NET мог начать писать на C#.

    C# так мало отличается от С++ под .NET Framework в Visual Studio, что всякий, кто знает С++ под .NET, может выучить C# за полчаса, и толстые книги для его изучения не нужны. Достаточно найти и запомнить несколько синтаксических отличий и несколько более существенных. Но если кто-либо знает С++, но не знает .NET Framework, то .NET Framework ему и надо учить, а не C#.

    Главное отличие, о котором почему-то мало кто упоминает:
    если вы пишете на С++ под .NET в Visual Studio, то вы можете, кроме .NET, использовать стандартную библиотеку С++. Нравится вам STLевский вектор? – подключите соответствующий заголовочный файл и используйте на здоровье. Нужны какие-то WinAPI-функции? - подключайте windows.h и используйте.
    C# использует только библиотеку .NET и те библиотеки, которые напишете вы сами. Никаких windows.h, STL и т.д. Если ОЧЕНЬ нужна функция из тех библиотек, ее придется импортировать вручную.

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

    Рассмотрите этот код. Найдите все отличия от С++ - и половину C# уже знаете.

    Код
    using System;
    using System.Text;

    namespace MyConsoleProgram
    {
      class Program
      {
      static void Main(string[] args)
      {
      Console.WriteLine("Я уже знаю C#!");
      Console.ReadKey();
      }
      }
    }

    Пояснение. В C# нет ни системной паузы, ни getch() из <conio.h>. Чтобы консольное окно не закрывалось, едва открывшись, используют
    Console.ReadKey();
    или
    Console.ReadLine();

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

    При объявлении классов, в отличие от C++, модификаторы доступа должны указываться для каждого члена в отдельности.
    class Animals
    {
        public const string ClassOfAnimal = "Млекопитающее";
        private string Weight;

        public Animals(string text)
        {
            Console.WriteLine(text);
        }

        public void Print(string text)
        {
            Console.WriteLine(text);
        }

        private void ShowWeight()
        {
            Console.WriteLine(Weight);
        }
    }

    Вместо стрелки и двойного двоеточия - всегда точка.

    В С++ было
    using namespace System::IO;

    MyClass::a = 5;
    This->a = 5;
    MyObjectPointer->a = 5;
    MyObject.a = 5;

    В C#
    using System.IO;

    MyClass.a = 5;
    This.a = 5;
    MyObjectPointer.a = 5;
    MyObject.a = 5;

    Благодаря наличию в .NET автоматического сборщика мусора деструкторы пользовательских классов в C# не нужны - кроме случаев, когда пользовательский класс содержит указатели и небезопасный код (работающие с указателями методы).

    Пространства имён те же, что и в С++ под .NET, но слово namespace употребляется только при объявлении пространства имен данной программы.

    В С++ было
    using namespace System;
    ...
    namespace MyProgram

    В C#
    using System;
    но
    namespace MyProgram

    Переменные и типы

    Все как в С++, но string - самостоятельный тип данных.
    string message = "Allah akbar";
    Console.WriteLine(message);
    - это потому, что в .NET ВСЕ встроенные типы данных - это классы или структуры, поэтому любая переменная автоматом является членом какого-то класса, даже int, bool или char. String - тоже объект встроенного класса String.

    В C# нету typedef, так что вместо
    typedef unsigned long DWORD;
    пишем
    using DWORD = System.UInt64;
    или
    using DWORD = System.Int32;
    - и область видимости ограничена файлом, где этот using находится.
    Некоторым неудобно.

    Формально типы делятся на ссылочные (reference type) и value type или value-based type — где-то переводится как значимый тип, где-то тип значений, где-то структурный тип.
    Типы значений хранят данные непосредственно, ссылочные типы - ссылку на значение. Что такое ссылки, знатоки С++ знают.
    Есть информация, что типы значений хранятся в стеке, ссылочные - в управляемой куче.

    Массивы
    Массив статический делают так

    int[] My_massiv;
    string[] My_string_array = {"The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog"};

    Для объявления двумерных массивов, используются пустые индексы через запятую.
    int[,] My_table;

    В С++ было

    type name[n] ;
    int massiv[10];
    int table[5][3];

    Динамические массивы лучше всегда создавать как объекты встроенного класса Array платформы .NET Framework. Однако, обычные указатели, как в С++, в эти массивы помещать нельзя - надо или значения, или дескрипторы.

    Дескрипторы
    Дескриптор (управляемый указатель) - тот самый, что в С++ под .NET изображается с галочкой ClassDotNet ^ name;
    В С++ использовался как-то так
    StreamWriter ^file = File::CreateText(saveFileDialog1->FileName);
    а в C# галочка не нужна: просто ClassDotNet name;
    например
    StreamWriter file = File.CreateText(saveFileDialog1.FileName);

    Дескриптор - это тоже нечто вроде указателя, но:
    1) он может указывать только на объект встроенного класса .NET или пользовательского ссылочного класса, объявленного как ref class MyClass
    2) его возможности к этому и сводятся - больше с ним ничего делать нельзя, нельзя даже переназначить другому объекту в пределах одной области видимости
    3) с его объявления начинают создание объектов встроенных классов .NET, и это удобно: дескриптор можно объявить вне обработчиков событий, прямо внутри класса формы, а конкретные объекты создавать и использовать уже внутри обработчиков событий, и тогда объект, созданный в одном обработчике, будет виден во всех.
    4) все, что объявляется через дескриптор, записывается в особую область памяти - управляемую кучу. Суть управляемости - в основном в работе автоматического сборщика мусора.
    В C++/CLI классы бывают неуправляемые и управляемые, а последние должны быть обозначены ключевым словом ref для ссылочного типа и value для типа значений. Типы значений хранятся в стеке, управляемые ссылочные типы - в управляемой куче, неуправляемые ссылочные типы - в неуправляемой куче. Все, что объявляется без дескриптора, пишется в неуправляемую часть памяти, и для переноса данных из управляемой части в неуправляемую или обратно приходится делать специальные действия, иногда довольно громоздкие.
    В С++ под .NET объект встроенного класса .NET, помимо дескриптора с галочкой, требует для своего создания оператора gcnew, тогда как объекты иных классов создаются обычным new
    form2^ gform2 = gcnew form2;
    В C# этого различия нет - все объекты создаются через new
    form2 gform2 = new form2;

    Функции
    Ну, тут отличий от С++, кроме указанных в разделе ООП, нету.

    Указатели
    В C# можно использовать указатели так же, как и в С++, но это считается нежелательным, поскольку снижает надежность кода и среды выполнения в целом.
    Поэтому есть три правила:
    1. Методы в C#, если они используют указатели, должны иметь атрибут unsafe. Это ключевое слово можно применить не ко всему методу, а лишь к группе операторов.
    Код, помеченный как небезопасный, запускается вне области управления памятью с помощью сборщика мусора (Garbage Collector).

    using System;
    class MyClass
    {
        public unsafe void Method()
        {
            int x = 10;
            int *ptrx = &x;
            Console.WriteLine((int)ptrx);
            Console.WriteLine(*ptrx);
        }
    }

    class MyClient
    {
        public static void Main()
        {
            MyClass mc = new MyClass();
            mc.Method();
        }
    }

    Можно пометить как небезопасную и группу операторов:

    using System;

    class MyClass
    {
        public void Method()
        {
            unsafe
            {
                int y = 20;
                int *ptry = &y;
                Console.WriteLine((int)ptry);
                Console.WriteLine(*ptry);
            }
        }
    }

    class MyClient
    {
        public static void Main()
        {
            MyClass mc = new MyClass();
            mc.Method();
        }
    }
    2. Проект C#, в котором есть небезопасный (unsafe) код, должен иметь соответствующее разрешение в настройках (установить опцию компилятора /unsafe).

    3. Получение указателя от объекта возможно только в том случае, если он определен с атрибутом fixed.
    Дело в том, что любая уборщица может по неведению выбросить что-то нужное владельцу убираемого помещения, так и сборщик мусора в .NET может уничтожить ваши объекты в памяти в соответствии со своим алгоритмом процесса уборки мусора. Чтобы этого избежать, C# предоставляет специальное ключевое слово fixed, указывающее сборщику мусора не перемещать объект. Позиция переменной в памяти в памяти фиксируется, чтобы на нее мог ссылаться указатель. Это называется еще "прикрепление" (pinning).
    Пока процесс сбора мусора не встречает во время выполнения операторов fixed, потери ресурсов на них оказываются весьма незначительными. Но когда сборщик мусора встречает fixed, то фиксированные объекты могут привести к образованию фрагментации кучи (heap). Т. е. в куче могут появиться неиспользуемые участки, занимающие много места. Поэтому объекты должны помечаться как fixed только тогда, когда это абсолютно необходимо, и только на самый малый, насколько это возможно, промежуток времени выполнения кода.

    using System;
    class Test
    {
        public int num;
        public Test (int i) { num = i; }
    }
    class FixedCode
    {
        unsafe static void Main()
        {
            Test о = new TestA9); 
            fixed (int* p = &o.num)
            
                Console.WriteLine("Исходное значение переменной о.num: " + *р); 
                *р = 10; 
                Console.WriteLine("Новое значение переменной о.num: " + *р); 
            
        }
    }

    Кому мало этого материала- см. статью, прекрасно дополняющую нашу
    http://www.cyberforum.ru/cpp-cli/thread83662.html
    Категория: C# и другие языки | Добавил: Iren_Nietzsche (04.02.2014) | Автор: Iren_Nietzsche E
    Просмотров: 9419 | Комментарии: 374 | Теги: C#, C++ | Рейтинг: 3.0/2
    Всего комментариев: 3741 2 3 ... 37 38 »
    374 oymwag   (06.05.2022 22:12) [Материал]
    hydroxychloroquine risks <a href="https://keys-chloroquinehydro.com/#">can you buy chloroquine over the counter</a>

    373 Weari   (14.03.2022 21:50) [Материал]
    Таможенный агент «ВЭД ЛАЙН» все время следит за таможенными правилами наряду с тем несет, ответственность за правильную классификацию по ТН ВЭД ввозимых товаров по тысячам наименований. Объективно от того, оказываетесь ли вы участником внешнеторговой деятельности впервые или владельцем груза, мы прилагаем все усилия, с тем чтобы быстро пройти таможенное оформление https://ved-line.ru заказанных вами товаров и продукции, соблюдая все нормы таможенного законодательства. Наши таможенные специалисты сумеют рассчитать вашу цепочку поставок, чтобы развить таможенную деятельность, сократить затраты, определить допустимые категории риска и улучшить внутренний контроль и процедуры с целью обеспечения наилучшего соответствия требованиям. Мы работаем с вами, с тем чтобы организовать и представить всю нужную документацию, после того пройти таможенное оформление ваших товаров, удостовериться, что они в полной мере соответствуют таможенным правилам и требованиям, уплатить таможенные пошлины и налоги и сборы, в главном результате, отгрузить товары и продукцию в оговоренный пункт назначения.

    372 Weari   (04.03.2022 12:55) [Материал]
    «ВЭД ЛАЙН» — логистическая компания, специализирующийся на балкерных транспортировках «от двери до двери». Независимо от того, необходимы ли вам базовые фрахтовые услуги или же комплексные услуги, необходимые для нашего участия в процессах таможенного оформления импорта. «ВЭД ЛАЙН» https://ved-line.ru задает соответствующее совокупное решение в интересах заказчиков. Предоставляемые нами услуги целиком объединены с нашими возможностями, так чтобы вы находились извещены о текущем статусе ваших грузов, на каком маршруте грузоперевозки бы они не находились. Наша компания профессионалов по логистике грузов помогает заказчикам разобраться с секретами внешнеэкономических обязательств и сборе коммерческих документов, реализуя нормальную обработку грузов. «ВЭД ЛАЙН» к тому же предлагает заказчикам воспользоваться готовым решением для грузоперевозки большого объема груза на свободном морском транспорте грузовместимостью 3 000 т. по требованиям Инкотермс 2020 FOB морские порты Кореи — порт Находка Лесной Терминал — с погрузкой по жд или авто транспорт. Предложение выстроено специально в интересах вашего бизнеса.

    371 cialis generic   (10.11.2021 13:11) [Материал]
    cialis pills <a href="https://cialiswithdapoxetine.com/#">cialis support 365</a>

    370 cialis 20mg   (07.10.2021 15:10) [Материал]
    buy cialis usa <a href="https://cialiswithdapoxetine.com/#">cialis alternative</a>

    369 riree   (18.09.2021 07:16) [Материал]
    <a href=https://ved-line.ru/customs-avtorazbor>японские аукционы автомобилей цены</a>

    368 hydroxychloroquine cures   (24.08.2021 15:13) [Материал]
    hydroxychlor tab https://plaquenilx.com/# hcqs side effects

    367 hydroxychlor 200mg   (24.08.2021 02:10) [Материал]
    does hydroxychloroquine require a prescription https://plaquenilx.com/# what is hydroxychloroquine

    366 hydroxicloriquin   (23.08.2021 00:17) [Материал]
    hcqs pill https://plaquenilx.com/# hydroxychloroquine sulfate 200 mg

    365 hydroxychloroquine sulfate 200 mg   (22.08.2021 11:43) [Материал]
    hydroxychloroquine uses https://plaquenilx.com/# hydroxychloroquine 200mg

    1-10 11-20 21-30 ... 361-370 371-374
    Имя *:
    Email *:
    Все смайлы
    Код *:
    Copyright vZ © 2022