WEB开发网
开发学院软件开发C语言 Effective C# 原则30:选择与CLS兼容的程序集 阅读

Effective C# 原则30:选择与CLS兼容的程序集

 2009-02-19 08:16:09 来源:WEB开发网   
核心提示: // Overloaded Addition operator, preferred C# syntax:public static Foo operator+( Foo left, Foo right){// Use the same implementation as the Add

// Overloaded Addition operator, preferred C# syntax:
public static Foo operator+( Foo left, Foo right)
{
 // Use the same implementation as the Add method:
 return Foo.Add( left, right );
}
// Static function, desirable for some languages:
public static Foo Add( Foo left, Foo right)
{
 return new Foo ( left.Bar + right.Bar );
}

最后,注意在使用多态的接口时,那些非CLS的类型可能隐藏在一些接口中。最容易出现的就是在事件的参数中。这会让你创建一些CLS不兼容的类型,而在使用的地方却是用与CLS兼容的基类。

假设你创建了一个从EventArgs派生的类:

internal class BadEventArgs : EventArgs
{
 internal UInt32 ErrorCode;
}

这个BadEventArgs类型就是与CLS不兼容的,你不可能在其它语言中写的事件句柄上使用这个参数。但多态性却让这很容易发生。你只是申明了事件参数为基类:EventArgs:

// Hiding the non-compliant event argument:
public delegate void MyEventHandler(
 object sender, EventArgs args );
public event MyEventHandler OnStuffHappens;
// Code to raise Event:
BadEventArgs arg = new BadEventArgs( );
arg.ErrorCode = 24;
// Interface is legal, runtime type is not:
OnStuffHappens( this, arg );

以EventArgs为参数的接口申明是与CLS兼容的,然而,实际取代参数的类型是与CLS不兼容的。结果就是一些语言不能使用。

最后以如何实现CLS兼容类或者不兼容接口来结束对CLS兼容性的讨论。兼容性是可以实现的,但我们可以更简单的实现它。明白CLS与接口的兼容同样可以帮助你完整的理解CLS兼容的意思,而且可以知道运行环境是怎样看待兼容的。

上一页  1 2 3 4  下一页

Tags:Effective 原则 选择

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接