Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 什么是';CLSCompliant';NET中的属性?_.net_Cls Compliant - Fatal编程技术网

.net 什么是';CLSCompliant';NET中的属性?

.net 什么是';CLSCompliant';NET中的属性?,.net,cls-compliant,.net,Cls Compliant,属性是什么?当您希望确保任何其他.NET语言都可以使用CLSCompliant属性时,可以使用该属性标记类。 这些是基本规则: 未签名类型不应是类的公共接口的一部分。这意味着公共字段不应具有无符号类型,如uint或ulong,公共方法不应返回无符号类型,传递给公共函数的参数不应具有无符号类型。但是,未签名类型可以是私有成员的一部分 不安全类型,如指针不应与public成员一起使用。但是,它们可以与private成员一起使用 类名和成员名不应仅根据大小写而有所不同。例如,我们不能有两个名为MyMe

属性是什么?

当您希望确保任何其他.NET语言都可以使用
CLSCompliant
属性时,可以使用该属性标记类。
这些是基本规则:

  • 未签名类型不应是类的公共接口的一部分。这意味着公共字段不应具有无符号类型,如
    uint
    ulong
    ,公共方法不应返回无符号类型,传递给公共函数的参数不应具有无符号类型。但是,未签名类型可以是私有成员的一部分

  • 不安全类型,如指针不应与
    public
    成员一起使用。但是,它们可以与
    private
    成员一起使用

  • 类名和成员名不应仅根据大小写而有所不同。例如,我们不能有两个名为
    MyMethod
    MyMethod
    的方法

  • 只能重载属性和方法,不应重载运算符


  • CLS compliant是CLR允许的完整语言范围的子集。它将其限制为大多数针对CLR的语言可能提供的子集。这会增加,但不能保证所有以CLR为目标的语言都可以使用您的库

    它告诉代码的其他使用者它是,并且让C#编译器检查它是否符合CLS


    参考文章包含了更多关于CLS合规性要求的详细信息。

    其他答案是正确的。让我澄清一些事情——CLS代表公共语言规范。它是.NET语言必须实现和理解的最小规则集和必需的语言特性。此集合是的子集,它定义了在.NET中如何定义类型

    CLS兼容意味着您可以编写可由任何可在CLR上编译和运行的语言使用的代码。但不需要CLS合规性,在CLS合规性很难或不可能做到的情况下,您可以灵活处理

    如果您打算让其他开发人员使用您的代码,那么您的API(您的公共类和方法)应该符合CLS。您应该通过向程序集添加CLSCompliant属性来声明这一点。如果您不是为他人编写,则不需要遵守CLS,尽管(框架Cop)不同意我的意见


    当您的程序集被标记为CLSCompliantAttribute时,编译器将(应该!)检查您的代码,看看在编译时,它是否会违反任何CLS规则(ocdecio提到了其中一些规则)并将违规情况报告给您以进行修复。

    此处适用:要标记整个项目符合CLS,请将此行添加到
    AssemblyInfo.cs
    (可在解决方案资源管理器的属性下找到)

    或在VB.NET中等效(
    AssemblyInfo.VB
    隐藏在我的项目下)


    您会将此作为每个项目的默认设置吗?不一定,主要是针对那些可能接触其他.net语言的项目。另一个限制是CS3006:重载方法“Foo.Bar(ref Baz)”,只在ref或out或数组秩中有所不同,是不是CLS compliantOne更多:公共标识符不应该以下划线字符开头。因此,如果我添加该属性,然后毫无怨言地构建我的项目,这意味着我的项目符合CLS,并且一切正常?@Svish,是的。编译器会让你知道你是否违反了任何规则。FxCop把我带到了这里。不幸的是,CLR拥有许多不同前端语言的宏伟愿景(比如VB.NET——慢慢消亡——而其他语言现在消失了,比如MC++、Delphi.NET、Oxygene、J#、JScript.NET等等)限制了完成CLS兼容的好处,因为其他支持CLR的语言在支持非CLS兼容功能(如可选参数和
    out
    参数)方面没有问题-因此我认为微软需要重新审视CLS的要求,也许可以放宽它们。Oxygene和其他元素语言仍然以CLR为目标。
    [assembly:CLSCompliant(true)]
    
    <Assembly: CLSCompliant(True)>