【发布时间】:2015-06-14 13:13:54
【问题描述】:
我理解 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 修饰符,因为在上面的示例中实际上并不需要它,但是这样使用它实际上会给我带来什么问题吗?
【问题讨论】:
-
通过将成员声明为 public,您决定它们可以被任何引用您的对象的外部对象访问和/或修改。如果它不应该被修改,它应该是私有的
-
我相信如果
AddItem作者想告诉调用者Hey, I won't be modiyfing the paremeter,他会使用一个结构作为参数。在 C++ 中,const修饰符确保参数不会被修改。为什么它在 c# 中不可用?这是更好的解释:stackoverflow.com/questions/3263001/… -
@Tobsey:“应该可以修改”和“应该在传递给它的方法内修改”之间存在差异。 OP 正试图以某种方式复制类似于 C++ 的
const参数的东西。 -
@ArtyomNeustroev 这里没有要查看的代码。 OP正在询问一个概念。此外,我们不会审查假设的代码。不要通过去。不要收取 200 美元。
-
我认为这是一个糟糕的主意。现在调用这些方法后,我需要检查我的非空引用是否突然变为空。解决这个问题的正确方法是使用不可变类型和/或正确的方法文档,IMO。
标签: c# theory language-design