2

使用refは悪いプログラミングの実践ですか? 実際に ref を多用する古いコードのリファクタリングを行っています。Microsoft All Rules セットでコード分析を有効にしましたが、ルールは「参照によって型を渡さないでください」と言っています

原因: パブリック型のパブリック メソッドまたはプロテクト メソッドに、プリミティブ型、参照型、または組み込み型以外の値型を受け取る ref パラメータがあります。

なぜそれは本当に悪いのですか?これらをプライベート メソッドまたは内部メソッドで使用できますか? プライベート/内部メソッドで ref を使用することは、プログラミングの良い練習になりますか?

編集:ここにいくつかのサンプルがあります、

public void DoAutoScrollReverse(Rectangle rectangle, int xPosition, int yPosition,
    ref int deltaX, ref int deltaY)
{
}

public bool GetPointCoords(Graphics g, Point pMouse, DisplayBlock2D aBlock,
    ref Point3MD pt, ref DisplayPoint2D 2dPoint, ref double gapPos)
{
}

これらの関数内で起こっていることは、それらが初期化、設定、またはその他のものであることです。

更新:なぜ ref を使用しているのですか? 実は私はそうではありません。リファクタリングが必要な古いコード。いくつかのメソッドを削除しましたが、2 番目の例のような複雑な関数はできません。bool を返す (操作が成功したかどうかを伝える) 関数があり、異なるオブジェクトの 3 つの ref 値があります。ここで何をすべきですか?プライベート/内部にする (プライベート/内部の良い実践で ref を使用していますか?)

4

1 に答える 1

2

本当に必要でない限り ref は使わないほうがいいと思います。他の方法でローカル変数を変更できる場合、検出が困難なエラーが発生する可能性があります。

例は簡単に書き直すことができるので、もう ref を使用する必要はありません。

public void DoAutoScrollReverse(Rectangle rectangle, int xPosition, int yPosition,
ref int deltaX, ref int deltaY)
{
}

小さなクラスを作成します。

public class Delta
{
    int X { get; set; }
    int Y { get; set; }
}

参照なし:

public Delta DoAutoScrollReverse(Rectangle rectangle, int xPosition, int yPosition)
{
    return new Delta(deltaX, deltaY);
}

また、何かを返していることと、何を返しているかがより明確になりました。

于 2013-08-10T09:34:36.797 に答える