使用ref - 良好的编程习惯

时间:2013-07-22 05:08:34

标签: c# coding-style code-analysis

使用ref是不好的编程习惯吗?我正在对我的旧代码进行一些重构,实际上使用了ref很多。我已经使用Microsoft All Rules set启用了代码分析,并且规则说“不要通过引用传递类型”

原因:公共类型中的公共或受保护方法具有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?其实我不是。它的旧代码我需要重构。我摆脱了一些方法,但复杂的功能,如第二个例子,我不能。有一个返回bool的函数(告诉操作是否成功)并且有3个不同对象的ref值。我该怎么办?使它成为私人/内部(在私人/内部良好实践中使用ref?)

1 个答案:

答案 0 :(得分: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);
}

现在更清楚的是,您正在返回某些内容并您要返回的内容