C#中的静态构造函数 静态类 C# 泛型和 C++ 模板之间的主要差异
2007-08-23 10:31
399 查看
静态构造函数用于初始化任何静态数据,或用于执行仅需执行一次的特定操作。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数。
静态构造函数具有以下特点:
· 静态构造函数既没有访问修饰符,也没有参数。
· 在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。
· 无法直接调用静态构造函数。
· 在程序中,用户无法控制何时执行静态构造函数。
· 静态构造函数的典型用途是:当类使用日志文件时,将使用这种构造函数向日志文件中写入项。
· 静态构造函数在为非托管代码创建包装类时也很有用,此时该构造函数可以调用 LoadLibrary 方法。
静态类和类成员用于创建无需创建类的实例就能够访问的数据和函数。静态类成员可用于分离独立于任何对象标识的数据和行为:无论对象发生什么更改,这些数据和函数都不会随之变化。当类中没有依赖对象标识的数据或行为时,就可以使用静态类。
类可以声明为static的,以指示它仅包含静态成员。不能使用 new关键字创建静态类的实例。静态类在加载包含该类的程序或命名空间时由 .NET Framework 公共语言运行库 (CLR) 自动加载。
使用静态类来包含不与特定对象关联的方法。例如,创建一组不操作实例数据并且不与代码中的特定对象关联的方法是很常见的要求。您应该使用静态类来包含那些方法。
静态类的主要功能如下:
· 它们仅包含静态成员。
· 它们不能被实例化。
· 它们是密封的。
· 它们不能包含实例构造函数(C# 编程指南)。
因此创建静态类与创建仅包含静态成员和私有构造函数的类大致一样。私有构造函数阻止类被实例化。
使用静态类的优点在于,编译器能够执行检查以确保不致偶然地添加实例成员。编译器将保证不会创建此类的实利。
静态类是密封的,因此不可被继承。静态类不能包含构造函数,但仍可声明静态构造函数以分配初始值或设置某个静态状态。有关更多信息,请参见静态构造函数(C# 编程指南)。
C# 泛型和 C++ 模板都是用于提供参数化类型支持的语言功能。然而,这两者之间存在许多差异。在语法层面上,C# 泛型是实现参数化类型的更简单方法,不具有 C++ 模板的复杂性。此外,C# 并不尝试提供 C++ 模板所提供的所有功能。在实现层面,主要区别在于,C# 泛型类型替换是在运行时执行的,从而为实例化的对象保留了泛型类型信息。有关更多信息,请参见运行库的泛型(C# 编程指南)。
以下是 C# 泛型和 C++ 模板之间的主要差异:
· C# 泛型未提供与 C++ 模板相同程度的灵活性。例如,尽管在 C# 泛型类中可以调用用户定义的运算符,但不能调用算术运算符。
· C# 不允许非类型模板参数,如
· C# 不支持显式专用化,即特定类型的模板的自定义实现。
· C# 不支持部分专用化:类型参数子集的自定义实现。
· C# 不允许将类型参数用作泛型类型的基类。
· C# 不允许类型参数具有默认类型。
· 在 C# 中,尽管构造类型可用作泛型,但泛型类型参数自身不能是泛型。C++ 确实允许模板参数。
· C++ 允许那些可能并非对模板中的所有类型参数都有效的代码,然后将检查该代码中是否有用作类型参数的特定类型。C# 要求相应地编写类中的代码,使之能够使用任何满足约束的类型。例如,可以在 C++ 中编写对类型参数的对象使用算术运算符 + 和 - 的函数,这会在使用不支持这些运算符的类型来实例化模板时产生错误。C# 不允许这样;唯一允许的语言构造是那些可从约束推导出来的构造。
静态构造函数具有以下特点:
· 静态构造函数既没有访问修饰符,也没有参数。
· 在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。
· 无法直接调用静态构造函数。
· 在程序中,用户无法控制何时执行静态构造函数。
· 静态构造函数的典型用途是:当类使用日志文件时,将使用这种构造函数向日志文件中写入项。
· 静态构造函数在为非托管代码创建包装类时也很有用,此时该构造函数可以调用 LoadLibrary 方法。
静态类和类成员用于创建无需创建类的实例就能够访问的数据和函数。静态类成员可用于分离独立于任何对象标识的数据和行为:无论对象发生什么更改,这些数据和函数都不会随之变化。当类中没有依赖对象标识的数据或行为时,就可以使用静态类。
类可以声明为static的,以指示它仅包含静态成员。不能使用 new关键字创建静态类的实例。静态类在加载包含该类的程序或命名空间时由 .NET Framework 公共语言运行库 (CLR) 自动加载。
使用静态类来包含不与特定对象关联的方法。例如,创建一组不操作实例数据并且不与代码中的特定对象关联的方法是很常见的要求。您应该使用静态类来包含那些方法。
静态类的主要功能如下:
· 它们仅包含静态成员。
· 它们不能被实例化。
· 它们是密封的。
· 它们不能包含实例构造函数(C# 编程指南)。
因此创建静态类与创建仅包含静态成员和私有构造函数的类大致一样。私有构造函数阻止类被实例化。
使用静态类的优点在于,编译器能够执行检查以确保不致偶然地添加实例成员。编译器将保证不会创建此类的实利。
静态类是密封的,因此不可被继承。静态类不能包含构造函数,但仍可声明静态构造函数以分配初始值或设置某个静态状态。有关更多信息,请参见静态构造函数(C# 编程指南)。
C# 泛型和 C++ 模板都是用于提供参数化类型支持的语言功能。然而,这两者之间存在许多差异。在语法层面上,C# 泛型是实现参数化类型的更简单方法,不具有 C++ 模板的复杂性。此外,C# 并不尝试提供 C++ 模板所提供的所有功能。在实现层面,主要区别在于,C# 泛型类型替换是在运行时执行的,从而为实例化的对象保留了泛型类型信息。有关更多信息,请参见运行库的泛型(C# 编程指南)。
以下是 C# 泛型和 C++ 模板之间的主要差异:
· C# 泛型未提供与 C++ 模板相同程度的灵活性。例如,尽管在 C# 泛型类中可以调用用户定义的运算符,但不能调用算术运算符。
· C# 不允许非类型模板参数,如
template C<int i> {}。
· C# 不支持显式专用化,即特定类型的模板的自定义实现。
· C# 不支持部分专用化:类型参数子集的自定义实现。
· C# 不允许将类型参数用作泛型类型的基类。
· C# 不允许类型参数具有默认类型。
· 在 C# 中,尽管构造类型可用作泛型,但泛型类型参数自身不能是泛型。C++ 确实允许模板参数。
· C++ 允许那些可能并非对模板中的所有类型参数都有效的代码,然后将检查该代码中是否有用作类型参数的特定类型。C# 要求相应地编写类中的代码,使之能够使用任何满足约束的类型。例如,可以在 C++ 中编写对类型参数的对象使用算术运算符 + 和 - 的函数,这会在使用不支持这些运算符的类型来实例化模板时产生错误。C# 不允许这样;唯一允许的语言构造是那些可从约束推导出来的构造。
相关文章推荐
- C++ 模板和 C# 泛型之间的区别
- C++ 模板和 C# 泛型之间的区别(C# 编程)
- C++ 模板和 C# 泛型之间的区别(C# 编程指南)
- C++ 模板和 C# 泛型之间的区别
- C#/C++ 模板和 C# 泛型之间的区别(C# 编程指南
- 【c#】面向对象简介(构造、析构函数,静态构造函数、静态类)
- 编写高质量代码改善C#程序的157个建议——建议106:为静态类添加静态构造函数
- C#和Java的泛型、C++模板、C#的constraints特性以及弱类型化和强类型化的问题(转)
- c#学习系列之静态类,静态构造函数,静态成员,静态方法(总之各种静态)
- C# - 静态类和静态构造函数
- C# 泛型和 C++ 模板
- 浅析C#与C++在静态构造函数上的异同
- C#中的泛型与C++中的模板
- C# vs C++之三:静态构造函数
- C++与C#对比学习:模板,泛型
- 浅析C#与C++在静态构造函数上的异同
- C#的静态构造函数(主要说的是编译器为Lambda表达式生成的类)
- C++、C#、JAVA中模板与泛型
- C#的静态构造函数和静态类
- C# vs C++之三:静态构造函数