在这种情况下更好,返回或参考

时间:2013-04-23 17:39:30

标签: c# return ref

假设我有以下一组静态函数

这里我通过引用发送变量:

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?

之间是否有任何性能差异?

6 个答案:

答案 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参数,一切都被封装了。