我读了几篇文章说,通过在C#3.0中引入命名参数,参数名称现在是公共合同的一部分.这是真的,它到底意味着什么?我运行了一个简单的测试,在MyLib.dll中更改参数名称没有破坏使用原始名称的命名参数调用该方法的MyApp.exe,我认为因为C#编译器在编译时执行了重载决策,并且生成了IL对参数名称一无所知.这就是反汇编代码在Reflector上看到的内容:
private static void Main()
{
bool CS$0$0000 = true;
Class1.DoSomething(CS$0$0000);
Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud)
......这是原始的源代码:
static void Main() {
MyLib.Class1.DoSomething(a: true);
Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud)
Eri*_*ert 19
我读了几篇文章说,通过在C#3.0中引入命名参数,参数名称现在是公共合同的一部分.这是真的,它到底意味着什么?
确实,参数名称是公共合同的一部分,但该语句包含两个错误.
最明显的错误是在C#4.0中引入了命名参数,而不是C#3.0.
但更微妙的错误更为重要.在C#4.0中引入命名参数现在没有使参数名称成为方法的公共契约的一部分.参数名称始终是公共合同的一部分,因为C#以外的语言具有命名参数功能.特别是,VB始终支持命名参数.
因此,更改库中参数的名称始终是VB重新编译的重大变化.现在它也是C#重新编译的一个重大变化,但这并不意味着它之前是安全的,现在它很危险.这总是危险的.
C#不是唯一的.NET语言,不是目前为止.当您更改某个类型的公开可见表面的一部分时,您可能会破坏每种语言的程序.具有或不具有特征的C#不会改变该事实.
Ree*_*sey 12
问题是,假设你有一个这样的公共API:
public void Foo(bool a = false)
{
//....
Run Code Online (Sandbox Code Playgroud)
调用者可以编写使用它的应用程序,如下所示:
Foo(a: true);
Run Code Online (Sandbox Code Playgroud)
如果您然后将方法更改为:
public void Foo(bool aBetterName = false)
{
//....
Run Code Online (Sandbox Code Playgroud)
现在,突然之间,调用者的代码将不再编译,因为编译器(一旦更新到新库)将不再看到名为的参数a.
| 归档时间: |
|
| 查看次数: |
1014 次 |
| 最近记录: |