Effective C# 原则30:选择与CLS兼容的程序集
2009-02-19 08:16:09 来源:WEB开发网这个接口如果是定义在CLS兼容程序集中,那么它是CLS兼容的:
[ assembly:CLSCompliant( true ) ]
public interface IFoo
{
void DoStuff( Int32 arg1, string arg2 );
}
你可以在任何与CLS兼容的类中实现它。然而,如果你在与没有标记与CLS兼容的程序集中定义了这个接口,那么这个IFoo接口就并不是CLS兼容的接口。也就是说,一个接口只是满足CLS规范是不够的,还必须定义在一个CSL兼容的程序集中时才是CLS兼容的。原因是编译器造成的,编译器只在程序集标记为CLS兼容时才检测CLS兼容类型。相似的,编译器总是假设在CLS不兼容的程序集中定义的类型实际上都是CLS不兼容的。然而,这个接口的成员具有CLS兼容性标记。即使IFoo没有标记为CLS兼容,你也可以在CLS兼容类中实现这个IFoo接口。这个类的客户可以通过类的引来访问DoStuff,而不是IFoo接口的引用。
考虑这个简单的参数:
public interface IFoo2
{
// Non-CLS compliant, Unsigned int
void DoStuff( UInt32 arg1, string arg2 );
}
一个公开实现了IFoo2接口的类,与CLS是不兼容的。为了让一个类即实现IFoo2接口,同时也是CLS兼容的,你必须使用清楚的接口定义:
public class MyClass: IFoo2
{
// explicit interface implementation.
// DoStuff() is not part of MyClass's public interface
void IFoo2.DoStuff( UInt32 arg1, string arg2 )
{
// content elided.
}
}
MyClass 有一个与CLS兼容的接口,希望访问IFoo2 接口的客户必须通过访问与CLS不兼容的IFoo2接口指针。
兼容了吗?不,还没。创建一个CLS兼容类型要求所有的公共以及受保护接口都只包含CLS兼容类型。这就是说,某个类的基类也必须是CLS兼容的。所有实现的接口也必须是CLS兼容的。如果你实现了一个CLS不兼容的接口,你必须实现明确的接口定义,从而在公共接口上隐藏它。
CLS兼容性并没有强迫你去使用最小的公共名称来实现你的设计。它只是告诉你应该小心使用程序集上的公共的接口。以于任何公共的或者受保护的类,在构造函数中涉及的任何类型必须是CLS兼容的,这包含:
*基类
*从公共或者受保护的方法和属性上返回的值
*公共及受保护的方法和索引器的参数
*运行时事件参数
*公共接口的申明和实现
编译器会试图强制兼容一个程序集。这会让提供最小级别上的CLS兼容变得很简单。再稍加小心,你就可以创建一个其它语言都可以使用的程序集了。编译器的规范试图确保不用牺牲你所喜欢的语言的结构就可以尽可能的与其它语言兼容。你只用在接口中提供可选的方案就行了。
CLS兼容性要求你花点时间站在其它语言上来考虑一下公共接口。你不必限制所有的代码都与CLS兼容,只用避免接口中的不兼容结构就行了。通用语言的可操作性值得你花点时间。
- ››选择好的广告联盟:选择广告联盟理解掌握的六大绝招...
- ››选择谁? 揭秘90后必备的音乐播放器
- ››选择性关闭Win 7视频预览 节约系统资源
- ››选择适合的SRAM存储器的技巧
- ››Effective C# 原则40:根据需求选择集合
- ››Effective C# 原则41:选择DataSet而不是自定义的...
- ››Effective C# 原则42:使用特性进行简单的反射
- ››Effective C# 原则43:请勿滥用反射
- ››Effective C# 原则44:创建应用程序特定的异常类
- ››Effective C# 第6章:杂项
- ››Effective C# 原则45:选择强异常来保护程序
- ››Effective C# 原则47:选择安全的代码
更多精彩
赞助商链接