Değişikliklerin Anahattı
Bu anahat C++ için Yönetilen Uzantılar'dan Visual C++ 2010'a dildeki bazı değişikliklerin örneklerini gösterir. Daha fazla bilgi için her ögeyle verilen bağlantıyı izleyin.
Çift Altçizgili Anahtar Sözcükler Yok
Bir özel durum dışında, tüm anahtar sözcüklerin önünde çift alt çizgi kaldırılmıştır. Bu yüzden, __value value olur, __interface interface olur, vb. Anahtar sözcüklerle kullanıcı kodundaki tanımlayıcılar arasında ad çakışmalarından kaçınmak için, anahtar sözcükler öncelikle bağlamsal olarak değerlendirilir.
Daha fazla bilgi için bkz. Dil Anahtar Kelimeleri.
Sınıf Bildirimleri
Yönetilen Uzantılar sözdizimi:
__gc class Block {}; // reference class
__value class Vector {}; // value class
__interface I {}; // interface class
__gc __abstract class Shape {}; // abstract class
__gc __sealed class Shape2D : public Shape {}; // derived class
Yeni sözdizimi:
ref class Block {}; // reference class
value class Vector {}; // value class
interface class I {}; // interface class
ref class Shape abstract {}; // abstract class
ref class Shape2D sealed: Shape{}; // derived class
Daha fazla bilgi için bkz: Yönetilen Türler (C++/CL).
Nesne Bildirimleri
Yönetilen Uzantılar sözdizimi:
public __gc class Form1 : public System::Windows::Forms::Form {
private:
System::ComponentModel::Container __gc *components;
System::Windows::Forms::Button __gc *button1;
System::Windows::Forms::DataGrid __gc *myDataGrid;
System::Data::DataSet __gc *myDataSet;
};
Yeni sözdizimi:
public ref class Form1 : System::Windows::Forms::Form {
System::ComponentModel::Container^ components;
System::Windows::Forms::Button^ button1;
System::Windows::Forms::DataGrid^ myDataGrid;
System::Data::DataSet^ myDataSet;
};
Daha fazla bilgi için bkz: CLR Başvuru Sınıf Nesnesi Bildirimi.
Yönetilen Yığın Ayırma
Yönetilen Uzantılar sözdizimi:
Button* button1 = new Button; // managed heap
int *pi1 = new int; // native heap
Int32 *pi2 = new Int32; // managed heap
Yeni sözdizimi:
Button^ button1 = gcnew Button; // managed heap
int * pi1 = new int; // native heap
Int32^ pi2 = gcnew Int32; // managed heap
Daha fazla bilgi için bkz: CLR Başvuru Sınıf Nesnesi Bildirimi.
Olmayan Nesneye İzleme Başvurusu
Yönetilen Uzantılar sözdizimi:
// OK: we set obj to refer to no object
Object * obj = 0;
// Error: no implicit boxing
Object * obj2 = 1;
Yeni sözdizimi:
// Incorrect Translation
// causes the implicit boxing of both 0 and 1
Object ^ obj = 0;
Object ^ obj2 = 1;
// Correct Translation
// OK: we set obj to refer to no object
Object ^ obj = nullptr;
// OK: we initialize obj2 to an Int32^
Object ^ obj2 = 1;
Daha fazla bilgi için bkz. CLR Başvuru Sınıf Nesnesi Bildirimi.
Dizi Bildirimi
CLR dizisi yeniden tasarlanmıştır. stl vector şablon topluluğuna benzerdir, ama arka plandaki System::Array sınıfına eşler - başka bir deyişle, şablon uygulaması değildir.
Daha fazla bilgi için bkz: CLR Dizisi Bildirimi.
Parametre olarak Dizi
Yönetilen Uzantılar dizi sözdizimi:
void PrintValues( Object* myArr __gc[]);
void PrintValues( int myArr __gc[,,]);
Yeni dizi sözdizimi:
void PrintValues( array<Object^>^ myArr );
void PrintValues( array<int,3>^ myArr );
Dönüş Türü olarak Dizi
Yönetilen Uzantılar dizi sözdizimi:
Int32 f() [];
int GetArray() __gc[];
Yeni dizi sözdizimi:
array<Int32>^ f();
array<int>^ GetArray();
Yerel CLR Dizisinin Kısayol Başlatma
Yönetilen Uzantılar dizi sözdizimi:
int GetArray() __gc[] {
int a1 __gc[] = { 1, 2, 3, 4, 5 };
Object* myObjArray __gc[] = { __box(26), __box(27), __box(28),
__box(29), __box(30) };
return a1;
}
Yeni dizi sözdizimi:
array<int>^ GetArray() {
array<int>^ a1 = {1,2,3,4,5};
array<Object^>^ myObjArray = {26,27,28,29,30};
return a1;
}
Açık CLR Dizi Bildirimi
Yönetilen Uzantılar dizi sözdizimi:
Object* myArray[] = new Object*[2];
String* myMat[,] = new String*[4,4];
Yeni dizi sözdizimi:
array<Object^>^ myArray = gcnew array<Object^>(2);
array<String^,2>^ myMat = gcnew array<String^,2>(4,4);
Dilde yenilik: gcnew'i izleyen açık dizi başlatma
// explicit initialization list follow gcnew
// is not supported in Managed Extensions
array<Object^>^ myArray =
gcnew array<Object^>(4){ 1, 1, 2, 3 };
Ölçekli Özellikler
Yönetilen Uzantılar özellik sözdizimi:
public __gc __sealed class Vector {
double _x;
public:
__property double get_x(){ return _x; }
__property void set_x( double newx ){ _x = newx; }
};
Yeni özellik sözdizimi:
public ref class Vector sealed {
double _x;
public:
property double x
{
double get() { return _x; }
void set( double newx ){ _x = newx; }
} // Note: no semi-colon …
};
Dilde yenilik: önemsiz özellikler
public ref class Vector sealed {
public:
// equivalent shorthand property syntax
// backing store is not accessible
property double x;
};
Daha fazla bilgi için bkz. Özellik Bildirimi.
Dizinli Özellikler
Yönetilen Uzantılar dizinli özellik sözdizimi:
public __gc class Matrix {
float mat[,];
public:
__property void set_Item( int r, int c, float value) { mat[r,c] = value; }
__property int get_Item( int r, int c ) { return mat[r,c]; }
};
Yeni dizinli özellik sözdizimi:
public ref class Matrix {
array<float, 2>^ mat;
public:
property float Item [int,int] {
float get( int r, int c ) { return mat[r,c]; }
void set( int r, int c, float value ) { mat[r,c] = value; }
}
};
Dilde yenilik: sınıf düzeyinde dizinli özellik
public ref class Matrix {
array<float, 2>^ mat;
public:
// ok: class level indexer now
// Matrix mat;
// mat[ 0, 0 ] = 1;
//
// invokes the set accessor of the default indexer
property float default [int,int] {
float get( int r, int c ) { return mat[r,c]; }
void set( int r, int c, float value ) { mat[r,c] = value; }
}
};
Daha fazla bilgi için bkz. Özellik Dizini Bildirimi.
Yüklenmiş İşleçler
Yönetilen Uzantılar işlev aşırı yüklemesi sözdizimi:
public __gc __sealed class Vector {
public:
Vector( double x, double y, double z );
static bool op_Equality( const Vector*, const Vector* );
static Vector* op_Division( const Vector*, double );
};
int main() {
Vector *pa = new Vector( 0.231, 2.4745, 0.023 );
Vector *pb = new Vector( 1.475, 4.8916, -1.23 );
Vector *pc = Vector::op_Division( pa, 4.8916 );
if ( Vector::op_Equality( pa, pc ))
;
}
Yeni işleç aşırı yüklemesi sözdizimi:
public ref class Vector sealed {
public:
Vector( double x, double y, double z );
static bool operator ==( const Vector^, const Vector^ );
static Vector^ operator /( const Vector^, double );
};
int main() {
Vector^ pa = gcnew Vector( 0.231, 2.4745, 0.023 );
Vector^ pb = gcnew Vector( 1.475, 4.8916, -1.23 );
Vector^ pc = pa / 4.8916;
if ( pc == pa )
;
}
Daha fazla bilgi için bkz. Yüklenmi? Y?leçler.
Dönüştürme İşleçleri
Yönetilen Uzantılar dönüştürme işleci sözdizimi:
__gc struct MyDouble {
static MyDouble* op_Implicit( int i );
static int op_Explicit( MyDouble* val );
static String* op_Explicit( MyDouble* val );
};
Yeni dönüştürme işleci sözdizimi:
ref struct MyDouble {
public:
static operator MyDouble^ ( int i );
static explicit operator int ( MyDouble^ val );
static explicit operator String^ ( MyDouble^ val );
};
Daha fazla bilgi için bkz. Dönüştürme İşleçlere Değiştirme.
Arayüz Üyesini Açık Geçersiz Kılma
Yönetilen Uzantılar açık geçersiz kılma sözdizimi:
public __gc class R : public ICloneable {
// to be used through ICloneable
Object* ICloneable::Clone();
// to be used through an R
R* Clone();
};
Yeni açık geçersiz kılma sözdizimi:
public ref class R : public ICloneable {
// to be used through ICloneable
virtual Object^ InterfaceClone() = ICloneable::Clone;
// to be used through an R
virtual R^ Clone();
};
Daha fazla bilgi için bkz. Arayüz Üyesini Açık Geçersiz Kılma.
Özel Sanal İşlevler
Yönetilen Uzantılar özel sanal işlev sözdizimi:
__gc class Base {
private:
// inaccessible to a derived class
virtual void g();
};
__gc class Derived : public Base {
public:
// ok: g() overrides Base::g()
virtual void g();
};
Yeni özel sanal işlev sözdizimi:
ref class Base {
private:
// inaccessible to a derived class
virtual void g();
};
ref class Derived : public Base {
public:
// error: cannot override: Base::g() is inaccessible
virtual void g() override;
};
Daha fazla bilgi için bkz. Özel Sanal İşlevler.
CLR Numaralandırma Türü
Yönetilen Uzantılar numaralandırma sözdizimi:
__value enum e1 { fail, pass };
public __value enum e2 : unsigned short {
not_ok = 1024,
maybe, ok = 2048
};
Yeni numaralandırma sözdizimi:
enum class e1 { fail, pass };
public enum class e2 : unsigned short {
not_ok = 1024,
maybe, ok = 2048
};
Bu küçük sözdizimi değişikliğinden ayrı olarak, CLR numaralandırma türünün davranışı çeşitli yollarla değişmiştir:
CLR numaralandırmasının ileriye dönük bildirimi artık desteklenmemektedir.
Yerleşik aritmetik türleri ve Object sınıf hiyerarşisi arasında aşırı yükleme çözünürlüğü Yönetilen Uzantılar ve Visual C++ 2010 arasında ters çevrilmiştir. Yan etki olarak, CLR numaralandırmaları artık dolaylı olarak aritmetik türlere dönüştürülmez.
Yeni sözdiziminde, CLR numaralaması kendi kapsamını tutar, ve bu Yönetilen Uzantılar için böyle değildir. Önceden, numaralandırıcılar içerme kapsamında görünebilirdi; şimdi numaralandırıcılar, numaralandırıcının kapsamı içerisinde kapsüllenmiştir.
Daha fazla bilgi için bkz.CLR Enum Türü.
__box Anahtar Sözcüğünün Kaldırılması
Yönetilen Uzantılar kutulama sözdizimi:
Object *o = __box( 1024 ); // explicit boxing
Yeni kutulama sözdizimi:
Object ^o = 1024; // implicit boxing
Daha fazla bilgi için bkz. Paketlenmiş Değere İzleme İşleyicisi.
Sabitleme İşaretçisi
Yönetilen Uzantılar sabitleme işaretçisi sözdizimi:
__gc struct H { int j; };
int main() {
H * h = new H;
int __pin * k = & h -> j;
};
Yeni sabitleme işaretçisi sözdizimi:
ref struct H { int j; };
int main() {
H^ h = gcnew H;
pin_ptr<int> k = &h->j;
}
Daha fazla bilgi için bkz. Değer Türleri Anlamları.
__typeof Anahtar Sözcüğü typeid Oldu
Yönetilen Uzantılar typeof sözdizimi:
Array* myIntArray =
Array::CreateInstance( __typeof(Int32), 5 );
Yeni typeid sözdizimi:
Array^ myIntArray =
Array::CreateInstance( Int32::typeid, 5 );
Daha fazla bilgi için bkz. typeof T::typeid'ye gider.