假设我有以下一组静态函数
这里我通过引用发送变量:
public static void ProcessEmailMessage(ref string HTML)
{
ModifyLinks(ref HTML);
AddFakeImage(ref HTML);
}
public static void ModifyLinks(ref string HTML)
{
//modify HTML links
}
public static void AddFakeImage(ref string HTML)
{
//adds an image to the HTML
}
这里我按值发送变量
public static string ProcessEmailMessage(string HTML)
{
HTML = ModifyLinks(HTML);
HTML = AddFakeImage(HTML);
return HTML;
}
public static string ModifyLinks(string HTML)
{
//modify HTML links
return HTML;
}
public static string AddFakeImage(string HTML)
{
//adds an image to the HTML
return HTML;
}
哪一个更有意义,2?
之间是否有任何性能差异?答案 0 :(得分:8)
尽可能避免使用out-和ref参数。
使用ref和out参数的方法更难以使用,您需要声明一个变量来保存结果,并且语义更难以理解。性能差异(如果有的话)可以忽略不计。
Visual Studio中的代码分析可能会在这种情况下发出警告。
有关更详细的说明,请参阅http://msdn.microsoft.com/en-us/library/ms182131。
答案 1 :(得分:2)
使用ref
时可能会有更多性能损失,因为在分配给变量时,这相当于额外的间接级别。但是,这种差异可能微不足道。
我更喜欢返回字符串的表单,因为这更能说明实际发生的情况,并允许您根据需要将方法调用链接在一起:
return AddFakeImage(ModifyLinks(HTML));
使用ref
表单,您强制调用代码来声明变量,否则他们可能不需要。这妨碍了可读性并增加了无意义的样板代码的发生率。
答案 2 :(得分:1)
两者之间的性能差异可以忽略不计。这完全是对语法的偏好问题。
标准约定将涉及返回新字符串而不是修改通过引用传递的参数。在某些情况下,它更容易使用(即,当您没有命名变量时;例如,当您想要传递方法或属性的返回值而不是字段时)。
答案 3 :(得分:1)
没什么区别,但我会选择“返回”。尽可能避免“ref”。
原因是你不必在传递另一个调用的结果之前声明一个变量,你可以链接调用:
用ref:
string modifyMe = GetMeString();
ModifyLints(ref modifyMe);
AddFakeImage(ref modifyMe);
与回归相比:
string result = AddFakeImage(ModifyLinks(GetMeString()));
答案 4 :(得分:1)
如果您需要使用ref
/ out
返回多个对象,如果您只需返回一个对象return
就可以执行此操作,请使用return
。
ref
使您的代码不必要地模糊,并产生写入开销,在这种情况下是不必要的
您应该始终尝试使代码简单易用。
答案 5 :(得分:1)
我喜欢像建筑师这样的东西:
new EmailMessageProcessor(html).WithModifiedLinks()。WithFakeImages()。
所以没有ref参数,一切都被封装了。