【问题标题】:Using ref - Good programming practice or not [closed]使用 ref - 良好的编程习惯与否 [关闭]
【发布时间】:2013-07-22 05:08:33
【问题描述】:

使用ref 是不好的编程习惯吗?我正在对实际上大量使用 ref 的旧代码进行一些重构。我已使用 Microsoft 所有规则集打开代码分析,并且规则说“不要通过引用传递类型”

原因:公共类型中的公共或受保护方法有一个 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 吗?)

【问题讨论】:

  • 我们没有足够的上下文来回答这个问题。 ref 并不总是不好,但通常值得避免并且经常被误解。如果你能给我们一个你正在考虑使用它的例子,那会很有帮助。
  • @JonSkeet 添加了一些示例方法定义,
  • @FaisalHafeez:在第一种情况下,看起来您应该返回某种向量,它结合了deltaXdeltaY。我们真的不知道第二种方法想要做什么,这使得很难说解决方案应该是什么。
  • @FaisalHafeez:不,您不应该从第一个版本返回 point - 点不是向量,并且给定名称 deltaX 和 @987654329 @,您确实是指一个向量(两点之间的差异)。 “复杂方法”非常模糊——你需要给出非常具体的例子。有时值得为输出创建一个类型(为了清楚起见,在可行的情况下更喜欢out 而不是ref),有时这意味着该方法做得太多。

标签: c# coding-style code-analysis


【解决方案1】:

我认为除非真的有必要,否则最好不要使用 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);
}

现在,您返回的东西以及返回的内容也更加清晰。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    • 2023-03-09
    • 2023-03-31
    • 2013-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多