c# - 使用 ref 表示参数将被修改

标签 c# theory language-design

我理解 ref 意味着提交的引用在方法返回时可能指向一个完全不同的对象。

不过,我喜欢 ref 修饰符的一点是,开发人员可以立即知道他输入的内容在方法返回时可能会有所不同,因为调用方也需要 ref 修饰符。

采用一个简单的方法,来自一个假设的 ORM:

public Boolean AddItem(Entity someEntity)
{
  try
  {
    // Add item to database
    // Get Id of entity back from database
    someEntity.Id = *returnedId*;
    return true;
  }
  catch (DBException ex)
  {
    return false;
  }
}

该方法的任何调用者可能不知道他们的实体已通过调用该方法进行了更新。然而,让 someEntity 成为 ref 参数,它向开发人员表明他们提交的参数会有所不同,然后他们知道要深入研究文档/代码以找出它是如何更改的,如果没有修饰符,他们可能从未想过这样做。

我知道这有点滥用 ref 修饰符,因为在上面的示例中实际上不需要它,但是以这种方式使用它真的会给我带来任何问题吗?

最佳答案

我认为这是虐待。假设Entity是一个引用类型,参数声明

bool AddItem(ref Entity someEntity)

表示该方法可能会将引用 someEntity 移动到“指向”一个完全不同的对象实例。

如果您所做的只是改变现有实例someEntity,请不要编写ref。相反,使用名称(方法名称和参数名称)和说明您将“改变”(更改)对象的文档。 示例名称(您可以选择更好的名称,因为您知道实际代码):AddItemAndUpdateEntityID

使用 ref 的后果:

  • 调用者必须使用一个变量。他不能使用属性、方法调用或表达式计算的返回值
  • 调用者必须使用确切的类型,他不能传递 SpecificEntity,例如,SpecificEntity 派生自 Entity
  • 您的方法的逻辑必须准备好其他线程(或您自己调用的其他方法)可能会更改 ref 参数的标识。例如,如果您检查方法顶部的 someEntity == null,则稍后在您的方法中可能已更改,因为其他人可能已将引用移动到其他地方。<

关于c# - 使用 ref 表示参数将被修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29533966/

相关文章:

c# - C#中的TCP监听器启动异常

java - 理论上是否可以使用静态分析工具证明Java代码不存在竞争条件?

c - 为什么 switch 语句设计为需要中断?

language-agnostic - 类型作为一等对象有什么好处?

r - ->(右箭头)和 <-(左箭头)在 for 循环中的不同行为

c# - 如果 ServiceBus 主题尚不存在,则创建它

c# - ASP.NET/LINQ/EF : Async on custom distinct comparer class

c# - 如何在我的表单停止响应的情况下填充数据 GridView ?

haskell - 为什么FRP将时间作为值(value)的一个因素?

security - secret 计算 : does such an animal exist?