在原版语言定义中,一个引用类类型以 __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{};