c# - 下位互換性を損なうことなくパラメーターの名前を変更する
私は C# ライブラリに取り組んでいるので、後方互換性を壊すことを懸念していますが、パラメーターの名前を変更するだけで後方互換性を維持できるかどうか疑問に思っていました。名前。私がやろうとしていることの例を以下に示します
[Obsolete("use ChangeSpecificFoo(SpecificFoo specificFoo)")]
public void ChangeSpecificFoo(SpecificFoo foo)
{
_specificFoo = foo;
}
//Compile error ... already defines a member called 'ChangeSpecificFoo' with the same parameter types
public void ChangeSpecificFoo(SpecificFoo specificFoo)
{
_specificFoo = specificFoo;
}
パラメータの名前を変更するだけで、下位互換性が失われる可能性があります po誰かが ChangeSpecificFoo(foo: someSpecificFoo) のような名前付きパラメーターを使用してメソッドを呼び出している可能性がありますが、パラメーター名がメソッド シグネチャに含まれていないため、正しいパラメーター名で新しいメソッドを追加してメソッドを非推奨にすることはできません。コンパイラはそれを重複と見なします。
これを回避する方法はありますか?私が見る唯一の代替手段は、メソッドの名前を変更して重複しないようにし、その後 unapr にすることです上記の方法を試すか、パラメーターリストにパラメーターを追加または削除してからパラメーター名を変更するまで待つか (メソッドが非常に安定しているため、これは決して起こらない可能性があります)、単に変更を加えて発生する可能性のある割り込みを修正します。このライブラリを使用しているコードは、見つけたとおりです。
------------に答える------------
これに対する私の最初の傾向は単純です: いいえ。名前そのパラメーターの e は、メソッドの本体の外では無関係です。人々があなたを名前で呼んで、あなたを壊す可能性があることを考えると、あなたは正しいです。ただし、単に er パラメータの名前を変更しても、実際のメリットはありません。
名前を変更する唯一の理由は、古い名前が紛らわしいため、メソッドの機能を再定義することです。その場合、別の形式の混乱を招かないように、メソッド名も変更する必要があります。 (彼メソッド シグネチャが同一であるという事実は、パラメータ名を変更しない最初の最も重要な理由です。ただし、これは、そうする必要がある理由を説明するためのものです。)
ただし、同じメソッド シグネチャを保持したいが、名前を変更したい場合は、これを行うことができます。 (繰り返しますが、elを続行するには、まったく変更しないか、メソッド名も変更することを強くお勧めします混乱を弱体化します)。
これを回避する 1 つの方法は、メソッドに両方のパラメーターを指定し、2 番目のパラメーターをオプションにすることです。最後のパラメーターに古い名前を使用させ、それをメソッド内で割り当てます。
また、名前付きパラメーターの使用をログに記録して、名前付きパラメーターとして呼び出している人々についてあなたの懸念が妥当かどうかを確認することも非常にお勧めします。
public void ChangeSpecificFoo(SpecificFoo specificFoo = null, SpecificFoo foo = null)
{
if (foo != null && specificFoo == null)
{
// Add any other details you can, especially
// to figure out who is calling this.
Log("Someone used a name parameter!!");
}
_specificFoo = specificFoo ?? foo;
}
Dmitry Bychenko がコメントで指摘したように、これはレコードをトリガーする ChangeSpecificFoo(null, new SpecificFoo()) のようなこのメソッドを誰もが呼び出すことを妨げません。
あなたの発言は、これが悪い考えである別の理由を示しています: あなたは今、人々があなたのメソッドを「間違って」呼び出す別の方法を提示しています.したがって、私の回答の冒頭からアドバイスを繰り返します: 本当に、本当に、本当にそのパラメータの名前を変更する必要がない限り、これをしないでください。
タグ:
関連記事:
ios: 「exc_bad_instruction (code=exc_i386_invop subcode=0x0)」の修正方法