构造调用中无需参数直接赋值类属性的原理(以DllImport为例)
关于DllImport特性中
CharSet=CharSet.Auto写法的原理 这是.NET中特性(Attribute)的专属语法,和普通构造函数调用完全是两回事,拆解一下:
首先,
[DllImport("Kernel32.dll", CharSet = CharSet.Auto)]里的两部分是不同的东西:"Kernel32.dll"是传给DllImportAttribute构造函数的参数(对应它唯一的构造函数参数dllName);CharSet = CharSet.Auto是特性的属性初始化器,不是构造参数。
.NET特性语法允许在构造参数之后,用这种
属性名=值的格式,直接初始化特性类的公共属性或公共字段。编译器在处理这段代码时,会先调用构造函数创建DllImportAttribute实例,再自动执行实例.CharSet = CharSet.Auto的赋值操作,最后把配置好的特性元数据附加到目标成员上。你看到的
CharSet是DllImportAttribute类的公共属性,所以符合这个语法的要求——只要特性类的成员是公共可写的,就能在特性声明里用这种方式初始化,不需要构造函数包含对应的参数。
简单说,这不是构造函数的多参数调用,而是「构造实例 + 批量初始化属性」的语法糖,是.NET为特性专门设计的语法规则。
内容的提问来源于stack exchange,提问作者kvirk
相关产品推荐
相关产品推荐

