在原版語言定義中,一個引用類類型以 __gc要害字開頭。在修訂版語言中,__gc要害字被兩個由空格分隔的要害字 ref class或者 ref strUCt之一替代。struct或者 class的選擇只是指明在類型體中開頭未標記部分聲明的其成員的公共(對于 struct)或者私有(對于 class)默認訪問級別。類似地,在原版語言定義中,一個 value 類類型以 __value 要害字開頭。在修訂版語言中,__value 要害字被兩個由空格分隔的要害字 value class或者 value struct之一代替。在原版語言設計中,一個接口類型是用要害字 __interface指明的。在修訂版語言中,它被 interface class替代。例如,下列類聲明對 // 原版語法 public __gc class Block { ... }; // 引用類 public __value class Vector { ... }; // 值類 public __interface IMyFile { ... }; // 接口類 在修訂版語言設計下等價的聲明如下: // 修訂版語法 public ref class Block { ... }; public value class Vector { ... }; public interface class IMyFile { ... }; 選擇 ref(對于引用類型)而不是 gc(對于垃圾收集類型)是為了便于更好地暗示這個類型的本質。2.1.1指定一個類為抽象類型在原版語言定義中,要害字 __abstract放在類型要害字之前(__gc之前或者之后)以指明該類尚未完成,而且此類的對象不能在程序中創建: public __gc __abstract class Shape {}; public __gc __abstract class Shape2D: public Shape {}; 在修訂版語言設計中,abstract 與上下文相關的要害字被限定在類名之后,類體、基類派生列表或者分號之前。 public ref class Shape abstract {}; public ref class Shape2D abstract : public Shape{}; 當然,語義沒有變化。2.1.2指定一個類為密封類型在原版語言定義中,要害字 __sealed放在 class 要害字之前(__gc之前或者之后)以指明類的對象不能從以下類繼續: public __gc __sealed class String {}; 在 V2語言設計中,與上下文相關的抽象要害字限定在類名之后,類體、基類派生列表或者分號之前(您可以聲明一個繼續類并密封它。舉例來說,String類隱式派生自Object)。密封一個類的好處是答應靜態(即在編譯時)解析這個密封引用類對象的所有的虛函數調用。這是因為密封指示符保證了 String跟蹤句柄不能指向一個可能重載被調用的虛方法實例的派生類。 public ref class String sealed {}; 也可以將一個類既聲明為抽象類也聲明為密封類。這是一種被稱為靜態類的非凡情況。這在CLI文檔中描述如下:同時為抽象和密封的類型只能有靜態成員,并且以一些語言中調用命名空間一樣的方式服務。例如,以下是一個使用 V1語法的抽象密封類的聲明 public __gc __sealed __abstract class State { public: static State(); static bool inParamList(); private: static bool ms_inParam; }; 而以下是在修訂版語言設計中的聲明: public ref class State abstract sealed { public: static State(); static bool inParamList(); private: static bool ms_inParam; }; 2.1.3 CLI繼續: 指定基類在 CLI對象模型中,只支持公有方式的單繼續。但是,在原始語言定義中仍然保留了ISO-C++對基類的默認解釋,而無需訪問要害字指定私有派生。這意味著每一個 CLI繼續聲明必須用一個 public要害字來代替默認的解釋。很多用戶認為編譯器似乎過于嚴謹。// V1:錯誤:默認為私有派生 __gc class My : File{}; 在修訂版語言定義中,CLI繼續定義缺少訪問要害字時,默認是以公有的方式派生。這樣,公有訪問要害字就不再必要,而是可選的。雖然這個改變不需要對 V1的代碼做任何的修改,出于完整性考慮我仍將這個變化列出。// V2:正確:默認是公有性派生 ref class My : File{};
在原版語言定義中,一個引用類類型以 __gc要害字開頭。在修訂版語言中,__gc要害字被兩個由空格分隔的要害字 ref class或者 ref struct之一替代。struct或者 class的選擇只是指明在類型體中開頭未標記部分聲明的其成員的公共(對于 struct)或者私有(對于 class)默認訪問級別。類似地,在原版語言定義中,一個 value 類類型以 __value 要害字開頭。在修訂版語言中,__value 要害字被兩個由空格分隔的要害字 value class或者 value struct之一代替。在原版語言設計中,一個接口類型是用要害字 __interface指明的。在修訂版語言中,它被 interface class替代。例如,下列類聲明對 // 原版語法 public __gc class Block { ... }; // 引用類 public __value class Vector { ... }; // 值類 public __interface IMyFile { ... }; // 接口類 在修訂版語言設計下等價的聲明如下: // 修訂版語法 public ref class Block { ... }; public value class Vector { ... }; public interface class IMyFile { ... }; 選擇 ref(對于引用類型)而不是 gc(對于垃圾收集類型)是為了便于更好地暗示這個類型的本質。2.1.1指定一個類為抽象類型在原版語言定義中,要害字 __abstract放在類型要害字之前(__gc之前或者之后)以指明該類尚未完成,而且此類的對象不能在程序中創建: public __gc __abstract class Shape {}; public __gc __abstract class Shape2D: public Shape {}; 在修訂版語言設計中,abstract 與上下文相關的要害字被限定在類名之后,類體、基類派生列表或者分號之前。 public ref class Shape abstract {}; public ref class Shape2D abstract : public Shape{}; 當然,語義沒有變化。2.1.2指定一個類為密封類型在原版語言定義中,要害字 __sealed放在 class 要害字之前(__gc之前或者之后)以指明類的對象不能從以下類繼續: public __gc __sealed class String {}; 在 V2語言設計中,與上下文相關的抽象要害字限定在類名之后,類體、基類派生列表或者分號之前(您可以聲明一個繼續類并密封它。舉例來說,String類隱式派生自Object)。密封一個類的好處是答應靜態(即在編譯時)解析這個密封引用類對象的所有的虛函數調用。這是因為密封指示符保證了 String跟蹤句柄不能指向一個可能重載被調用的虛方法實例的派生類。 public ref class String sealed {}; 也可以將一個類既聲明為抽象類也聲明為密封類。這是一種被稱為靜態類的非凡情況。這在CLI文檔中描述如下:同時為抽象和密封的類型只能有靜態成員,并且以一些語言中調用命名空間一樣的方式服務。例如,以下是一個使用 V1語法的抽象密封類的聲明 public __gc __sealed __abstract class State { public: static State(); static bool inParamList(); private: static bool ms_inParam; }; 而以下是在修訂版語言設計中的聲明: public ref class State abstract sealed { public: static State(); static bool inParamList(); private: static bool ms_inParam; }; 2.1.3 CLI繼續: 指定基類在 CLI對象模型中,只支持公有方式的單繼續。但是,在原始語言定義中仍然保留了ISO-C++對基類的默認解釋,而無需訪問要害字指定私有派生。這意味著每一個 CLI繼續聲明必須用一個 public要害字來代替默認的解釋。很多用戶認為編譯器似乎過于嚴謹。// V1:錯誤:默認為私有派生 __gc class My : File{}; 在修訂版語言定義中,CLI繼續定義缺少訪問要害字時,默認是以公有的方式派生。這樣,公有訪問要害字就不再必要,而是可選的。雖然這個改變不需要對 V1的代碼做任何的修改,出于完整性考慮我仍將這個變化列出。// V2:正確:默認是公有性派生 ref class My : File{};
在原版語言定義中,一個引用類類型以 __gc要害字開頭。在修訂版語言中,__gc要害字被兩個由空格分隔的要害字 ref class或者 ref struct之一替代。struct或者 class的選擇只是指明在類型體中開頭未標記部分聲明的其成員的公共(對于 struct)或者私有(對于 class)默認訪問級別。類似地,在原版語言定義中,一個 value 類類型以 __value 要害字開頭。在修訂版語言中,__value 要害字被兩個由空格分隔的要害字 value class或者 value struct之一代替。在原版語言設計中,一個接口類型是用要害字 __interface指明的。在修訂版語言中,它被 interface class替代。例如,下列類聲明對 // 原版語法 public __gc class Block { ... }; // 引用類 public __value class Vector { ... }; // 值類 public __interface IMyFile { ... }; // 接口類 在修訂版語言設計下等價的聲明如下: // 修訂版語法 public ref class Block { ... }; public value class Vector { ... }; public interface class IMyFile { ... }; 選擇 ref(對于引用類型)而不是 gc(對于垃圾收集類型)是為了便于更好地暗示這個類型的本質。2.1.1指定一個類為抽象類型在原版語言定義中,要害字 __abstract放在類型要害字之前(__gc之前或者之后)以指明該類尚未完成,而且此類的對象不能在程序中創建: public __gc __abstract class Shape {}; public __gc __abstract class Shape2D: public Shape {}; 在修訂版語言設計中,abstract 與上下文相關的要害字被限定在類名之后,類體、基類派生列表或者分號之前。 public ref class Shape abstract {}; public ref class Shape2D abstract : public Shape{}; 當然,語義沒有變化。2.1.2指定一個類為密封類型在原版語言定義中,要害字 __sealed放在 class 要害字之前(__gc之前或者之后)以指明類的對象不能從以下類繼續: public __gc __sealed class String {}; 在 V2語言設計中,與上下文相關的抽象要害字限定在類名之后,類體、基類派生列表或者分號之前(您可以聲明一個繼續類并密封它。舉例來說,String類隱式派生自Object)。密封一個類的好處是答應靜態(即在編譯時)解析這個密封引用類對象的所有的虛函數調用。這是因為密封指示符保證了 String跟蹤句柄不能指向一個可能重載被調用的虛方法實例的派生類。 public ref class String sealed {}; 也可以將一個類既聲明為抽象類也聲明為密封類。這是一種被稱為靜態類的非凡情況。這在CLI文檔中描述如下:同時為抽象和密封的類型只能有靜態成員,并且以一些語言中調用命名空間一樣的方式服務。例如,以下是一個使用 V1語法的抽象密封類的聲明 public __gc __sealed __abstract class State { public: static State(); static bool inParamList(); private: static bool ms_inParam; }; 而以下是在修訂版語言設計中的聲明: public ref class State abstract sealed { public: static State(); static bool inParamList(); private: static bool ms_inParam; }; 2.1.3 CLI繼續: 指定基類在 CLI對象模型中,只支持公有方式的單繼續。但是,在原始語言定義中仍然保留了ISO-C++對基類的默認解釋,而無需訪問要害字指定私有派生。這意味著每一個 CLI繼續聲明必須用一個 public要害字來代替默認的解釋。很多用戶認為編譯器似乎過于嚴謹。// V1:錯誤:默認為私有派生 __gc class My : File{}; 在修訂版語言定義中,CLI繼續定義缺少訪問要害字時,默認是以公有的方式派生。這樣,公有訪問要害字就不再必要,而是可選的。雖然這個改變不需要對 V1的代碼做任何的修改,出于完整性考慮我仍將這個變化列出。// V2:正確:默認是公有性派生 ref class My : File{};
在原版語言定義中,一個引用類類型以 __gc要害字開頭。在修訂版語言中,__gc要害字被兩個由空格分隔的要害字 ref class或者 ref struct之一替代。struct或者 class的選擇只是指明在類型體中開頭未標記部分聲明的其成員的公共(對于 struct)或者私有(對于 class)默認訪問級別。類似地,在原版語言定義中,一個 value 類類型以 __value 要害字開頭。在修訂版語言中,__value 要害字被兩個由空格分隔的要害字 value class或者 value struct之一代替。在原版語言設計中,一個接口類型是用要害字 __interface指明的。在修訂版語言中,它被 interface class替代。例如,下列類聲明對 // 原版語法 public __gc class Block { ... }; // 引用類 public __value class Vector { ... }; // 值類 public __interface IMyFile { ... }; // 接口類 在修訂版語言設計下等價的聲明如下: // 修訂版語法 public ref class Block { ... }; public value class Vector { ... }; public interface class IMyFile { ... }; 選擇 ref(對于引用類型)而不是 gc(對于垃圾收集類型)是為了便于更好地暗示這個類型的本質。2.1.1指定一個類為抽象類型在原版語言定義中,要害字 __abstract放在類型要害字之前(__gc之前或者之后)以指明該類尚未完成,而且此類的對象不能在程序中創建: public __gc __abstract class Shape {}; public __gc __abstract class Shape2D: public Shape {}; 在修訂版語言設計中,abstract 與上下文相關的要害字被限定在類名之后,類體、基類派生列表或者分號之前。 public ref class Shape abstract {}; public ref class Shape2D abstract : public Shape{}; 當然,語義沒有變化。2.1.2指定一個類為密封類型在原版語言定義中,要害字 __sealed放在 class 要害字之前(__gc之前或者之后)以指明類的對象不能從以下類繼續: public __gc __sealed class String {}; 在 V2語言設計中,與上下文相關的抽象要害字限定在類名之后,類體、基類派生列表或者分號之前(您可以聲明一個繼續類并密封它。舉例來說,String類隱式派生自Object)。密封一個類的好處是答應靜態(即在編譯時)解析這個密封引用類對象的所有的虛函數調用。這是因為密封指示符保證了 String跟蹤句柄不能指向一個可能重載被調用的虛方法實例的派生類。 public ref class String sealed {}; 也可以將一個類既聲明為抽象類也聲明為密封類。這是一種被稱為靜態類的非凡情況。這在CLI文檔中描述如下:同時為抽象和密封的類型只能有靜態成員,并且以一些語言中調用命名空間一樣的方式服務。例如,以下是一個使用 V1語法的抽象密封類的聲明 public __gc __sealed __abstract class State { public: static State(); static bool inParamList(); private: static bool ms_inParam; }; 而以下是在修訂版語言設計中的聲明: public ref class State abstract sealed { public: static State(); static bool inParamList(); private: static bool ms_inParam; }; 2.1.3 CLI繼續: 指定基類在 CLI對象模型中,只支持公有方式的單繼續。但是,在原始語言定義中仍然保留了ISO-C++對基類的默認解釋,而無需訪問要害字指定私有派生。這意味著每一個 CLI繼續聲明必須用一個 public要害字來代替默認的解釋。很多用戶認為編譯器似乎過于嚴謹。// V1:錯誤:默認為私有派生 __gc class My : File{}; 在修訂版語言定義中,CLI繼續定義缺少訪問要害字時,默認是以公有的方式派生。這樣,公有訪問要害字就不再必要,而是可選的。雖然這個改變不需要對 V1的代碼做任何的修改,出于完整性考慮我仍將這個變化列出。// V2:正確:默認是公有性派生 ref class My : File{};
在原版語言定義中,一個引用類類型以 __gc要害字開頭。在修訂版語言中,__gc要害字被兩個由空格分隔的要害字 ref class或者 ref struct之一替代。struct或者 class的選擇只是指明在類型體中開頭未標記部分聲明的其成員的公共(對于 struct)或者私有(對于 class)默認訪問級別。類似地,在原版語言定義中,一個 value 類類型以 __value 要害字開頭。在修訂版語言中,__value 要害字被兩個由空格分隔的要害字 value class或者 value struct之一代替。在原版語言設計中,一個接口類型是用要害字 __interface指明的。在修訂版語言中,它被 interface class替代。例如,下列類聲明對 // 原版語法 public __gc class Block { ... }; // 引用類 public __value class Vector { ... }; // 值類 public __interface IMyFile { ... }; // 接口類 在修訂版語言設計下等價的聲明如下: // 修訂版語法 public ref class Block { ... }; public value class Vector { ... }; public interface class IMyFile { ... }; 選擇 ref(對于引用類型)而不是 gc(對于垃圾收集類型)是為了便于更好地暗示這個類型的本質。2.1.1指定一個類為抽象類型在原版語言定義中,要害字 __abstract放在類型要害字之前(__gc之前或者之后)以指明該類尚未完成,而且此類的對象不能在程序中創建: public __gc __abstract class Shape {}; public __gc __abstract class Shape2D: public Shape {}; 在修訂版語言設計中,abstract 與上下文相關的要害字被限定在類名之后,類體、基類派生列表或者分號之前。 public ref class Shape abstract {}; public ref class Shape2D abstract : public Shape{}; 當然,語義沒有變化。2.1.2指定一個類為密封類型在原版語言定義中,要害字 __sealed放在 class 要害字之前(__gc之前或者之后)以指明類的對象不能從以下類繼續: public __gc __sealed class String {}; 在 V2語言設計中,與上下文相關的抽象要害字限定在類名之后,類體、基類派生列表或者分號之前(您可以聲明一個繼續類并密封它。舉例來說,String類隱式派生自Object)。密封一個類的好處是答應靜態(即在編譯時)解析這個密封引用類對象的所有的虛函數調用。這是因為密封指示符保證了 String跟蹤句柄不能指向一個可能重載被調用的虛方法實例的派生類。 public ref class String sealed {}; 也可以將一個類既聲明為抽象類也聲明為密封類。這是一種被稱為靜態類的非凡情況。這在CLI文檔中描述如下:同時為抽象和密封的類型只能有靜態成員,并且以一些語言中調用命名空間一樣的方式服務。例如,以下是一個使用 V1語法的抽象密封類的聲明 public __gc __sealed __abstract class State { public: static State(); static bool inParamList(); private: static bool ms_inParam; }; 而以下是在修訂版語言設計中的聲明: public ref class State abstract sealed { public: static State(); static bool inParamList(); private: static bool ms_inParam; }; 2.1.3 CLI繼續: 指定基類在 CLI對象模型中,只支持公有方式的單繼續。但是,在原始語言定義中仍然保留了ISO-C++對基類的默認解釋,而無需訪問要害字指定私有派生。這意味著每一個 CLI繼續聲明必須用一個 public要害字來代替默認的解釋。很多用戶認為編譯器似乎過于嚴謹。// V1:錯誤:默認為私有派生 __gc class My : File{}; 在修訂版語言定義中,CLI繼續定義缺少訪問要害字時,默認是以公有的方式派生。這樣,公有訪問要害字就不再必要,而是可選的。雖然這個改變不需要對 V1的代碼做任何的修改,出于完整性考慮我仍將這個變化列出。// V2:正確:默認是公有性派生 ref class My : File{};
在原版語言定義中,一個引用類類型以 __gc要害字開頭。在修訂版語言中,__gc要害字被兩個由空格分隔的要害字 ref class或者 ref struct之一替代。struct或者 class的選擇只是指明在類型體中開頭未標記部分聲明的其成員的公共(對于 struct)或者私有(對于 class)默認訪問級別。類似地,在原版語言定義中,一個 value 類類型以 __value 要害字開頭。在修訂版語言中,__value 要害字被兩個由空格分隔的要害字 value class或者 value struct之一代替。在原版語言設計中,一個接口類型是用要害字 __interface指明的。在修訂版語言中,它被 interface class替代。例如,下列類聲明對 // 原版語法 public __gc class Block { ... }; // 引用類 public __value class Vector { ... }; // 值類 public __interface IMyFile { ... }; // 接口類 在修訂版語言設計下等價的聲明如下: // 修訂版語法 public ref class Block { ... }; public value class Vector { ... }; public interface class IMyFile { ... }; 選擇 ref(對于引用類型)而不是 gc(對于垃圾收集類型)是為了便于更好地暗示這個類型的本質。2.1.1指定一個類為抽象類型在原版語言定義中,要害字 __abstract放在類型要害字之前(__gc之前或者之后)以指明該類尚未完成,而且此類的對象不能在程序中創建: public __gc __abstract class Shape {}; public __gc __abstract class Shape2D: public Shape {}; 在修訂版語言設計中,abstract 與上下文相關的要害字被限定在類名之后,類體、基類派生列表或者分號之前。 public ref class Shape abstract {}; public ref class Shape2D abstract : public Shape{}; 當然,語義沒有變化。2.1.2指定一個類為密封類型在原版語言定義中,要害字 __sealed放在 class 要害字之前(__gc之前或者之后)以指明類的對象不能從以下類繼續: public __gc __sealed class String {}; 在 V2語言設計中,與上下文相關的抽象要害字限定在類名之后,類體、基類派生列表或者分號之前(您可以聲明一個繼續類并密封它。舉例來說,String類隱式派生自Object)。密封一個類的好處是答應靜態(即在編譯時)解析這個密封引用類對象的所有的虛函數調用。這是因為密封指示符保證了 String跟蹤句柄不能指向一個可能重載被調用的虛方法實例的派生類。 public ref class String sealed {}; 也可以將一個類既聲明為抽象類也聲明為密封類。這是一種被稱為靜態類的非凡情況。這在CLI文檔中描述如下:同時為抽象和密封的類型只能有靜態成員,并且以一些語言中調用命名空間一樣的方式服務。例如,以下是一個使用 V1語法的抽象密封類的聲明 public __gc __sealed __abstract class State { public: static State(); static bool inParamList(); private: static bool ms_inParam; }; 而以下是在修訂版語言設計中的聲明: public ref class State abstract sealed { public: static State(); static bool inParamList(); private: static bool ms_inParam; }; 2.1.3 CLI繼續: 指定基類在 CLI對象模型中,只支持公有方式的單繼續。但是,在原始語言定義中仍然保留了ISO-C++對基類的默認解釋,而無需訪問要害字指定私有派生。這意味著每一個 CLI繼續聲明必須用一個 public要害字來代替默認的解釋。很多用戶認為編譯器似乎過于嚴謹。// V1:錯誤:默認為私有派生 __gc class My : File{}; 在修訂版語言定義中,CLI繼續定義缺少訪問要害字時,默認是以公有的方式派生。這樣,公有訪問要害字就不再必要,而是可選的。雖然這個改變不需要對 V1的代碼做任何的修改,出于完整性考慮我仍將這個變化列出。// V2:正確:默認是公有性派生 ref class My : File{};
在原版語言定義中,一個引用類類型以 __gc要害字開頭。在修訂版語言中,__gc要害字被兩個由空格分隔的要害字 ref class或者 ref struct之一替代。struct或者 class的選擇只是指明在類型體中開頭未標記部分聲明的其成員的公共(對于 struct)或者私有(對于 class)默認訪問級別。類似地,在原版語言定義中,一個 value 類類型以 __value 要害字開頭。在修訂版語言中,__value 要害字被兩個由空格分隔的要害字 value class或者 value struct之一代替。在原版語言設計中,一個接口類型是用要害字 __interface指明的。在修訂版語言中,它被 interface class替代。例如,下列類聲明對 // 原版語法 public __gc class Block { ... }; // 引用類 public __value class Vector { ... }; // 值類 public __interface IMyFile { ... }; // 接口類 在修訂版語言設計下等價的聲明如下: // 修訂版語法 public ref class Block { ... }; public value class Vector { ... }; public interface class IMyFile { ... }; 選擇 ref(對于引用類型)而不是 gc(對于垃圾收集類型)是為了便于更好地暗示這個類型的本質。2.1.1指定一個類為抽象類型在原版語言定義中,要害字 __abstract放在類型要害字之前(__gc之前或者之后)以指明該類尚未完成,而且此類的對象不能在程序中創建: public __gc __abstract class Shape {}; public __gc __abstract class Shape2D: public Shape {}; 在修訂版語言設計中,abstract 與上下文相關的要害字被限定在類名之后,類體、基類派生列表或者分號之前。 public ref class Shape abstract {}; public ref class Shape2D abstract : public Shape{}; 當然,語義沒有變化。2.1.2指定一個類為密封類型在原版語言定義中,要害字 __sealed放在 class 要害字之前(__gc之前或者之后)以指明類的對象不能從以下類繼續: public __gc __sealed class String {}; 在 V2語言設計中,與上下文相關的抽象要害字限定在類名之后,類體、基類派生列表或者分號之前(您可以聲明一個繼續類并密封它。舉例來說,String類隱式派生自Object)。密封一個類的好處是答應靜態(即在編譯時)解析這個密封引用類對象的所有的虛函數調用。這是因為密封指示符保證了 String跟蹤句柄不能指向一個可能重載被調用的虛方法實例的派生類。 public ref class String sealed {}; 也可以將一個類既聲明為抽象類也聲明為密封類。這是一種被稱為靜態類的非凡情況。這在CLI文檔中描述如下:同時為抽象和密封的類型只能有靜態成員,并且以一些語言中調用命名空間一樣的方式服務。例如,以下是一個使用 V1語法的抽象密封類的聲明 public __gc __sealed __abstract class State { public: static State(); static bool inParamList(); private: static bool ms_inParam; }; 而以下是在修訂版語言設計中的聲明: public ref class State abstract sealed { public: static State(); static bool inParamList(); private: static bool ms_inParam; }; 2.1.3 CLI繼續: 指定基類在 CLI對象模型中,只支持公有方式的單繼續。但是,在原始語言定義中仍然保留了ISO-C++對基類的默認解釋,而無需訪問要害字指定私有派生。這意味著每一個 CLI繼續聲明必須用一個 public要害字來代替默認的解釋。很多用戶認為編譯器似乎過于嚴謹。// V1:錯誤:默認為私有派生 __gc class My : File{}; 在修訂版語言定義中,CLI繼續定義缺少訪問要害字時,默認是以公有的方式派生。這樣,公有訪問要害字就不再必要,而是可選的。雖然這個改變不需要對 V1的代碼做任何的修改,出于完整性考慮我仍將這個變化列出。// V2:正確:默認是公有性派生 ref class My : File{};
在原版語言定義中,一個引用類類型以 __gc要害字開頭。在修訂版語言中,__gc要害字被兩個由空格分隔的要害字 ref class或者 ref struct之一替代。struct或者 class的選擇只是指明在類型體中開頭未標記部分聲明的其成員的公共(對于 struct)或者私有(對于 class)默認訪問級別。類似地,在原版語言定義中,一個 value 類類型以 __value 要害字開頭。在修訂版語言中,__value 要害字被兩個由空格分隔的要害字 value class或者 value struct之一代替。在原版語言設計中,一個接口類型是用要害字 __interface指明的。在修訂版語言中,它被 interface class替代。例如,下列類聲明對 // 原版語法 public __gc class Block { ... }; // 引用類 public __value class Vector { ... }; // 值類 public __interface IMyFile { ... }; // 接口類 在修訂版語言設計下等價的聲明如下: // 修訂版語法 public ref class Block { ... }; public value class Vector { ... }; public interface class IMyFile { ... }; 選擇 ref(對于引用類型)而不是 gc(對于垃圾收集類型)是為了便于更好地暗示這個類型的本質。2.1.1指定一個類為抽象類型在原版語言定義中,要害字 __abstract放在類型要害字之前(__gc之前或者之后)以指明該類尚未完成,而且此類的對象不能在程序中創建: public __gc __abstract class Shape {}; public __gc __abstract class Shape2D: public Shape {}; 在修訂版語言設計中,abstract 與上下文相關的要害字被限定在類名之后,類體、基類派生列表或者分號之前。 public ref class Shape abstract {}; public ref class Shape2D abstract : public Shape{}; 當然,語義沒有變化。2.1.2指定一個類為密封類型在原版語言定義中,要害字 __sealed放在 class 要害字之前(__gc之前或者之后)以指明類的對象不能從以下類繼續: public __gc __sealed class String {}; 在 V2語言設計中,與上下文相關的抽象要害字限定在類名之后,類體、基類派生列表或者分號之前(您可以聲明一個繼續類并密封它。舉例來說,String類隱式派生自Object)。密封一個類的好處是答應靜態(即在編譯時)解析這個密封引用類對象的所有的虛函數調用。這是因為密封指示符保證了 String跟蹤句柄不能指向一個可能重載被調用的虛方法實例的派生類。 public ref class String sealed {}; 也可以將一個類既聲明為抽象類也聲明為密封類。這是一種被稱為靜態類的非凡情況。這在CLI文檔中描述如下:同時為抽象和密封的類型只能有靜態成員,并且以一些語言中調用命名空間一樣的方式服務。例如,以下是一個使用 V1語法的抽象密封類的聲明 public __gc __sealed __abstract class State { public: static State(); static bool inParamList(); private: static bool ms_inParam; }; 而以下是在修訂版語言設計中的聲明: public ref class State abstract sealed { public: static State(); static bool inParamList(); private: static bool ms_inParam; }; 2.1.3 CLI繼續: 指定基類在 CLI對象模型中,只支持公有方式的單繼續。但是,在原始語言定義中仍然保留了ISO-C++對基類的默認解釋,而無需訪問要害字指定私有派生。這意味著每一個 CLI繼續聲明必須用一個 public要害字來代替默認的解釋。很多用戶認為編譯器似乎過于嚴謹。// V1:錯誤:默認為私有派生 __gc class My : File{}; 在修訂版語言定義中,CLI繼續定義缺少訪問要害字時,默認是以公有的方式派生。這樣,公有訪問要害字就不再必要,而是可選的。雖然這個改變不需要對 V1的代碼做任何的修改,出于完整性考慮我仍將這個變化列出。// V2:正確:默認是公有性派生 ref class My : File{};
在原版語言定義中,一個引用類類型以 __gc要害字開頭。在修訂版語言中,__gc要害字被兩個由空格分隔的要害字 ref class或者 ref struct之一替代。struct或者 class的選擇只是指明在類型體中開頭未標記部分聲明的其成員的公共(對于 struct)或者私有(對于 class)默認訪問級別。類似地,在原版語言定義中,一個 value 類類型以 __value 要害字開頭。在修訂版語言中,__value 要害字被兩個由空格分隔的要害字 value class或者 value struct之一代替。在原版語言設計中,一個接口類型是用要害字 __interface指明的。在修訂版語言中,它被 interface class替代。例如,下列類聲明對 // 原版語法 public __gc class Block { ... }; // 引用類 public __value class Vector { ... }; // 值類 public __interface IMyFile { ... }; // 接口類 在修訂版語言設計下等價的聲明如下: // 修訂版語法 public ref class Block { ... }; public value class Vector { ... }; public interface class IMyFile { ... }; 選擇 ref(對于引用類型)而不是 gc(對于垃圾收集類型)是為了便于更好地暗示這個類型的本質。2.1.1指定一個類為抽象類型在原版語言定義中,要害字 __abstract放在類型要害字之前(__gc之前或者之后)以指明該類尚未完成,而且此類的對象不能在程序中創建: public __gc __abstract class Shape {}; public __gc __abstract class Shape2D: public Shape {}; 在修訂版語言設計中,abstract 與上下文相關的要害字被限定在類名之后,類體、基類派生列表或者分號之前。 public ref class Shape abstract {}; public ref class Shape2D abstract : public Shape{}; 當然,語義沒有變化。2.1.2指定一個類為密封類型在原版語言定義中,要害字 __sealed放在 class 要害字之前(__gc之前或者之后)以指明類的對象不能從以下類繼續: public __gc __sealed class String {}; 在 V2語言設計中,與上下文相關的抽象要害字限定在類名之后,類體、基類派生列表或者分號之前(您可以聲明一個繼續類并密封它。舉例來說,String類隱式派生自Object)。密封一個類的好處是答應靜態(即在編譯時)解析這個密封引用類對象的所有的虛函數調用。這是因為密封指示符保證了 String跟蹤句柄不能指向一個可能重載被調用的虛方法實例的派生類。 public ref class String sealed {}; 也可以將一個類既聲明為抽象類也聲明為密封類。這是一種被稱為靜態類的非凡情況。這在CLI文檔中描述如下:同時為抽象和密封的類型只能有靜態成員,并且以一些語言中調用命名空間一樣的方式服務。例如,以下是一個使用 V1語法的抽象密封類的聲明 public __gc __sealed __abstract class State { public: static State(); static bool inParamList(); private: static bool ms_inParam; }; 而以下是在修訂版語言設計中的聲明: public ref class State abstract sealed { public: static State(); static bool inParamList(); private: static bool ms_inParam; }; 2.1.3 CLI繼續: 指定基類在 CLI對象模型中,只支持公有方式的單繼續。但是,在原始語言定義中仍然保留了ISO-C++對基類的默認解釋,而無需訪問要害字指定私有派生。這意味著每一個 CLI繼續聲明必須用一個 public要害字來代替默認的解釋。很多用戶認為編譯器似乎過于嚴謹。// V1:錯誤:默認為私有派生 __gc class My : File{}; 在修訂版語言定義中,CLI繼續定義缺少訪問要害字時,默認是以公有的方式派生。這樣,公有訪問要害字就不再必要,而是可選的。雖然這個改變不需要對 V1的代碼做任何的修改,出于完整性考慮我仍將這個變化列出。// V2:正確:默認是公有性派生 ref class My : File{};