Форум программистов, компьютерный форум, киберфорум
C++/CLI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/459: Рейтинг темы: голосов - 459, средняя оценка - 4.74
 Аватар для HIMen
4340 / 1509 / 101
Регистрация: 12.04.2009
Сообщений: 2,342

Основные отличия C# от C++ CLI

28.10.2009, 12:34. Показов 87110. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Основные отличия C# от C++/CLI:

1. Native код
С++/CLI (управляемый C++) — это расширение C++, соответствующее стандарту ECMA (ECMA 372). Значительное преимущество C++/CLI состоит в способности смешивать неуправляемый (native) код с управляемым кодом.

2. Пространства имен
В C# возможно определять псевдонимы для классов. В C++/CLI псевдонимы могут ссылаться только на другие пространства имен, но не на классы. В C++/CLI нельзя определять иерархические пространства имен в одном операторе namespace вместо этого пространства имен должны быть вложены друг в друга.
C#
1
2
3
4
5
6
7
8
9
10
using System;
using System.Collections.Generic;
using MyClasses = MyNamespace.CSharp.MyClasses;
using Vct = MyNamespace.CSharp.MyClasses.Vector;
namespace MyNamespace.CSharp.MyClasses;
{
    class Vector
    {
    }
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
using namespace System;
using namespace System::Collections::Generic;
namespace MyClasses = MyNamespace::CSharp::MyClasses;
namespace MyNamespace
{
    namespace CSharp
    {
        namespace MyClasses
        {
        }
    }
}
3. Определение типов
.NET различает 2 категории типов данных:
  • типы значений (value type), которые хранят данные непосредственно
  • ссылочные типы (reference type), которые хранят ссылку на значение
Типы значений хранятся в стеке, ссылочные - в управляемой куче.
В C# ссылочные типы определяются классами и предопределенными ссылочными типами (object и string), а типы значений — структурами и предопределенными типами значений(int, bool, double, ulong ...).
C#
1
2
3
4
5
6
7
int i; // тип значение
struct MyStruct // тип значение
{
}
class MyClass // ссылочный тип
{
}
В C++/CLI класс и структура — это почти одно и то же, но в нем разделяются управляемые и неуправляемые классы. Управляемые классы должны быть обозначены ключевым словом ref для ссылочного типа и value для типа значение. Типы значений обычно хранятся в стеке, управляемые ссылочные типы - в управляемой куче, неуправляемые ссылочные типы - в неуправляемой куче.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ref class MyClass // управляемый ссылочный тип
{
};
ref struct MyStruct // управляемый ссылочный тип
{
};
value class MyClass // управляемый тип значение
{
};
value struct MyStruct // управляемый тип значение
{
};
class MyClass // неуправляемый класс
{
};
struct MyStruct // неуправляемая структура
{
};
Для выделения памяти в управляемой куче C++/CLI имеет оператор gcnew.
C++
1
MyClass^ obj = gcnew MyClass ;
Маркер ^ (управляемый указатель) используется для указания того факта, что obj является дескриптором для объекта ссылочного класса типа MyClass, размещенного в управляемой куче.
В неуправляемой куче память выделяется оператором new.
C++
1
MyClass* obj = new MyClass ;
* - неуправляемый указатель
Если ссылочный тип не ссылается на память, языки используют разные ключевые слова: C# определяет литерал null, C++/CLI — nullptr

4. Перечисления
C#
1
2
3
4
public enum Color
{
    Red, Green, Blue
}
C++
1
2
3
4
public enum class Color
{
    Red, Green, Blue
};
5. Выведение типа
C# 3.0 позволяет определять локальную переменную без явного объявления типа — с помощью ключевого слова var.
В С++ стандарта 0х для этой цели появилось ключевое слово auto, но auto не может использоваться для объявления анонимных типов.

6. Методы
Методы всегда объявляются внутри класса. Синтаксис C++/CLI очень похож на C# за исключением того, что модификатор доступа не является частью объявления метода, а записывается перед ним.
C#
1
2
3
4
5
6
public class MyClass
{
    public void Foo()
    {
    }
}
C++
1
2
3
4
5
6
7
public ref class MyClass
{
public:
    void Foo()
    {
    }
};
В C++/CLI отсутствуют частичные классы

7. Модификаторы параметров
По умолчанию типы значений передаются по значению, а ссылочные типы — по ссылке. Если тип значений, переданный в виде параметра, должен быть изменен внутри вызванного метода, в C# вы можете использовать модификатор параметра ref. В C++/CLI определена операция управляемой ссылки %. Эта операция подобна операции ссылки & в C++, но с тем отличием, что % может использоваться с управляемыми типами, и сборщик мусора может отслеживать такие объекты в случае, если они будут перемещаться внутри управляемой кучи.
C#
1
2
3
4
5
6
7
public class ParameterPassing
{
    public void ChangeVal(ref int i)
    {
        i = 3;
    }
}
C++
1
2
3
4
5
6
7
8
public ref class ParameterPassing
{
public:
    int ChangeVal(int% i)
    {
        i = 3;
    }
};
При вызове метода со ссылочным параметром, только язык C# требует применения модификатора параметра. C++/CLI не делает разницы при вызове метода с модификатором параметра или без него. C# здесь имеет преимущество, сразу заметное при вызове метода, который может менять значение переданного ему параметра.
В C# также определено ключевое слово out для передачи в параметр неиницализированной переменной. Эта опция недоступна в C++/CLI.

8. Расширяющие методы
В C++/CLI нет расширяющих методов
Пример использования LINQ
C#
1
2
int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var res = arr.Where(n => n % 2 == 0).ToArray();
C++
1
2
array<int>^ arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
auto res = Enumerable::ToArray<int>(Enumerable::Where<int>(arr, gcnew Func<int, bool>(&predicate)));
C++
1
2
3
4
bool predicate(int i)
{
    return i % 2 == 0;
}
9. Конструкторы
При вызове одного конструктора из другого в C# требуется инициализация членов. В C++/CLI можно вызывать конструктор как метод.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Person
{
    public Person()
        : this("unknown", "unknown")
    { }
    public Person(string firstname, string lastname)
    {
        this.firstname = firstname;
        this.lastname = lastname;
    }
    private string firstname;
    private string lastname;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public ref class Person
{
public:
    Person()
    {
        Person("unknown", "unknown");
    }
    Person(String^ firstname, String^ lastname)
    {
        this->firstname = firstname;
        this->lastname = lastname;
    }
private:
    String^ firstname;
    String^ lastname;
};
10. Свойства
Чтобы определить свойство, в C# требуется только определить средства доступа set и get внутри блока свойства. Средство доступа set автоматически создает значение переменной компилятором C#. C++/CLI свойство определяется ключевым словом property.
C#
1
2
3
4
5
6
7
8
9
public class Person
{
    private string firstname;
    public string Firstname
    {
        get { return firstname; }
        set { firstname = value; }
    }
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public ref class Person
{
private:
    String^ firstname;
public:
    property String^ Firstname
    {
        String^ get()
        {
            return firstname;
        }
        void set(String^ value)
        {
            firstname = value;
        }
    }
property String^ Lastname;
};
В C# существуют также автоматические свойства
C#
1
2
3
4
public class Person
{    
    public string Firstname { get ; set ; }
}
11. Массивы
В C# при объявлении массива создается класс, унаследованный от базового класса Array.
C#
1
int[] arr1 = new int[15]
Массивы, не унаследованные от Array возможно размещать только в стеке в unsafe контексте
C#
1
int* arr2 = stackalloc int[15]
С++CLI имеет управляемые (унаследованные от Array) и неуправляемые массивы.
C++
1
2
array <int>^ arr1 = gcnew array <int>(15); // управляемый
int* arr2 = new int[15]; // неуправляемый
12. Порядок ключевых слов
В C# и С++CLI часто не совпадает порядок ключевых слов
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public abstract class Base
{
    public virtual void Foo()
    {
    }
    public abstract void Bar();
}
public class Derived : Base
{
    public override void Foo()
    {
        base.Foo();
    }
    public override void Bar()
    {
    }
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public ref class Base abstract
{
public:
    virtual void Foo()
    {
    }
    virtual void Bar() abstract;
};
public ref class Derived : public Base
{
public:
    virtual void Foo() override
    {
        Base::Foo();
    }
    virtual void Bar() override
    {
    }
};
13. Обобщенное программирование
C++/CLI поддерживает и шаблоны, и обобщения
C++
1
2
3
4
5
6
7
8
9
10
template <class T>
ref class Class1
{
    void Func(T input) { }
};
generic <class T>
ref class Class2
{
    void Func(T input) { }
};
C# - только обобщения
C#
1
2
3
4
public class Class<T>
{
    void Func(T input) { }
}
14. Деструкторы и финализаторы
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ref class MyClass
{
public:
    MyClass() { }  // конструктор
    ~MyClass() { } // деструктор, который будет превращен компилятором в  IDisposable.Dispose()
protected:
    !MyClass() { } // финализатор
};
void Test()
{
    MyClass a; // вызов конструктора, в конце блока автоматически будет вызван деструктор
 
    MyClass^ b = gcnew MyClass();  // вызов конструктора
    delete b; // вызов деструктора, если его не вызвать, в конце блока автоматически будет вызван финализатор 
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class MyClass : IDisposable
{
    public MyClass() {  }  // конструктор
    public void Dispose()   // Dispose
    ~MyClass() // деструктор
}
void Test()
{
    MyClass a = new MyClass(); // вызов конструктора, в конце блока автоматически будет вызван деструктор
 
    MyClass b = new MyClass(); // вызов конструктора
    b.Dispose(); // вызов Dispose,  в конце блока автоматически будет вызван деструктор
    //аналогичный код
    //using (MyClass b = new MyClass()) {  }
}
15. Наследование
В С++/CLI разрешено множественное наследование только для неуправляемых классов, управляемые классы, также как и классы в C# поддерживают лишь одно наследование реализации и неограниченное количество наследований интерфейса

16. Цикл foreach
С++/CLI позволяет изменят элементы внутри цикла foreach
C++
1
2
3
4
5
6
7
array<String^>^ arr = gcnew array<String^>(10);
int i = 0;
for each(String^% s in arr)
{
    s = i++.ToString();
    Console::WriteLine(s);
}
C#
1
2
3
4
5
6
string[] arr = new string[10];
int i = 0;
foreach (string s in arr)
{
    s =  i++.ToString(); // Compilation error
}
17. Индексированные свойства
В C++/CLI возможно определять индексаторы для отдельных свойств.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public ref class Class1
{
public:
    array<int>^ arr;
    Class1()
    {
        arr = gcnew array<int>(5);
    }
    property int Property[int] // индексированное свойство
    {
        int get (int index) 
        { 
            return arr[index];
        }
        void set (int index, int value)
        {
            arr[index] = value;
        }
    }
};
C++
1
2
Class1^ c = gcnew Class1();
c->Property[1] = 8;
85
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.10.2009, 12:34
Ответы с готовыми решениями:

Основные отличия C# от С++
Хочу создать эту тему для того чтобы выложить наиболее важные отличия языка C# от С++ для того чтобы понять насколько сложно перейти с С++...

Основные отличия OpenGL от DirectX?
Всем привет! Меня мучает такой вопрос: что перспективнее на данный момент OpenGL или DirectX? Если не трудно расскажите в 2-х...

Основные отличия abstract от обычного класса в C#
Привет. Помогите разобраться с данным вопросом. Чем отличаються abstract классы от обычных, кроме того, что объекты обычных можно...

1
23.08.2015, 15:13
 Комментарий модератора 
Если вы нашли неточность или опечатку, хотите что-то добавить к написанному в статье - обсуждение ведётся в отдельной теме: https://www.cyberforum.ru/faq/thread59556.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.08.2015, 15:13
Помогаю со студенческими работами здесь

Какие основные отличия естественной системы координат от декартовой?
Какие основные отличия естественной системы координат от декартовой?

Какие основные отличия статических методов конкатенации строк и интерполяции строк?
Здравствуйте. Может кто сможет ответить на вопрос какие основные отличия статических методов Concat конкатенации строк, Format и новой...

C# to C++/CLI
Есть вот такой код на C# public static IControlSystem proxy; public static int clientID = 1001; public SimitCtrl() { ...

c# ->c++/cli
foreach (KeyValuePair&lt;string, string&gt; pair in words) { source = source.Replace(pair.Key, pair.Value); } возникла проблема с...

CLI
Спецификфация CLI. Чем она представлена в C#? Если можно подробнее? На экзамене надо бла-бла-бла сделать.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Закрытая тема Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru