Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++/CLI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/289: Рейтинг темы: голосов - 289, средняя оценка - 4.88
HIMen
4265 / 1432 / 101
Регистрация: 12.04.2009
Сообщений: 2,346
1

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

28.10.2009, 12:34. Просмотров 52883. Ответов 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;
84
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2009, 12:34
Ответы с готовыми решениями:

c# ->c++/cli
foreach (KeyValuePair&lt;string, string&gt; pair in words) { source =...

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

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

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

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

1
tezaurismosis
23.08.2015, 15:13     Основные отличия C# от C++ CLI
  #2
 Комментарий модератора 
Если вы нашли неточность или опечатку, хотите что-то добавить к написанному в статье - обсуждение ведётся в отдельной теме: http://www.cyberforum.ru/faq/thread59556.html
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.08.2015, 15:13
Привет! Вот еще темы с ответами:

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

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

C, C++, C#, C++/CLI различия
после плюсов и шарпа решил глянуть что за CLI, так это как я понимаю тупо тот...


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

Или воспользуйтесь поиском по форуму:
2
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru