使用 ref 表示参数将被修改
Using ref to indicate parameter will be modified
我理解 ref 意味着当方法 returns.
提交的引用可能指向一个完全不同的对象
然而,我喜欢 ref 修饰符的一点是,开发人员立即知道他在方法 returns 时输入的内容可能有所不同,因为调用方也需要 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 参数,它向开发人员表明他们提交的参数会有所不同,然后他们知道要深入研究 documentation/code 以找出它是如何改变的,如果没有他们可能从未想过的修饰符所以。
我知道这有点滥用 ref 修饰符,因为在上面的示例中实际上不需要它,但是以这种方式使用它真的会给我带来任何问题吗?
我认为这是虐待。假设Entity
是引用类型,参数声明
bool AddItem(ref Entity someEntity)
表示该方法可能会将引用 someEntity
移动到 "point to" 一个完全不同的对象实例。
如果你所做的只是改变现有实例someEntity
,不要写ref
。相反,使用名称(方法名称和参数名称)和说明您将 "mutate"(更改)该对象的文档。
示例名称(您可以选择更好的名称,因为您知道实际代码):AddItemAndUpdateEntityID
使用ref
的后果:
- 调用方必须使用变量。他不能使用来自 属性、方法调用或表达式求值
的 return 值
- 调用者必须使用确切的类型,他不能传递
SpecificEntity
,比如说,其中 SpecificEntity
派生自 Entity
- 您的方法的逻辑必须准备好其他线程(或您自己调用的其他方法)可能会更改
ref
参数的标识。例如,如果您在方法的顶部检查 someEntity == null
是否在您的方法的稍后位置可能已更改,因为其他人可能已将引用移至别处。
However what I like about the ref modifier is that the developer immediately knows what he put in may be somehow different by the time the method returns
不,他们没有。
他们对 ref
修饰符的了解是,当方法 returns.
时,参数实际上可能引用某些东西 else
将接受引用类型的方法更改为使用 ref
只是为了给人一种错误的印象,这在任何方面都没有用。
当然也有反面;除了滥用 ref
来表示它并不意味着什么,你已经失去了 ref
来表示它 做 的意思的能力;必须检查代码以查看该方法是否实际使用 ref
,否则无法从一个方法调用另一个方法知道您是否仍在处理同一个对象。
我理解 ref 意味着当方法 returns.
提交的引用可能指向一个完全不同的对象然而,我喜欢 ref 修饰符的一点是,开发人员立即知道他在方法 returns 时输入的内容可能有所不同,因为调用方也需要 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 参数,它向开发人员表明他们提交的参数会有所不同,然后他们知道要深入研究 documentation/code 以找出它是如何改变的,如果没有他们可能从未想过的修饰符所以。
我知道这有点滥用 ref 修饰符,因为在上面的示例中实际上不需要它,但是以这种方式使用它真的会给我带来任何问题吗?
我认为这是虐待。假设Entity
是引用类型,参数声明
bool AddItem(ref Entity someEntity)
表示该方法可能会将引用 someEntity
移动到 "point to" 一个完全不同的对象实例。
如果你所做的只是改变现有实例someEntity
,不要写ref
。相反,使用名称(方法名称和参数名称)和说明您将 "mutate"(更改)该对象的文档。
示例名称(您可以选择更好的名称,因为您知道实际代码):AddItemAndUpdateEntityID
使用ref
的后果:
- 调用方必须使用变量。他不能使用来自 属性、方法调用或表达式求值 的 return 值
- 调用者必须使用确切的类型,他不能传递
SpecificEntity
,比如说,其中SpecificEntity
派生自Entity
- 您的方法的逻辑必须准备好其他线程(或您自己调用的其他方法)可能会更改
ref
参数的标识。例如,如果您在方法的顶部检查someEntity == null
是否在您的方法的稍后位置可能已更改,因为其他人可能已将引用移至别处。
However what I like about the ref modifier is that the developer immediately knows what he put in may be somehow different by the time the method returns
不,他们没有。
他们对 ref
修饰符的了解是,当方法 returns.
将接受引用类型的方法更改为使用 ref
只是为了给人一种错误的印象,这在任何方面都没有用。
当然也有反面;除了滥用 ref
来表示它并不意味着什么,你已经失去了 ref
来表示它 做 的意思的能力;必须检查代码以查看该方法是否实际使用 ref
,否则无法从一个方法调用另一个方法知道您是否仍在处理同一个对象。