我理解 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/