5

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

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

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;
        }

哪个更有意义,两者之间是否有任何性能差异?

4

6 回答 6

8

尽可能避免使用 out- 和 ref 参数。

带 ref 和 out 参数的方法比较难用,需要声明一个变量来保存结果,语义比较难理解。性能差异(如果有的话)可以忽略不计。

在这种情况下,Visual Studio 中的代码分析可能会针对它们的使用发出警告。

有关更详细的说明,请参阅http://msdn.microsoft.com/en-us/library/ms182131 。

于 2013-04-23T17:42:27.887 回答
2

使用 时可能会对性能产生更多影响ref,因为这在分配给变量时相当于额外的间接级别。但是,这种差异可能可以忽略不计。

我更喜欢返回字符串的表单,因为这更能说明实际发生的情况,并且如果您愿意,可以将方法调用链接在一起:

return AddFakeImage(ModifyLinks(HTML));

使用这种ref形式,您可以强制调用代码声明一个变量,否则它们可能不需要。这妨碍了可读性并增加了无意义的样板代码的发生率。

于 2013-04-23T17:42:36.230 回答
1

两者之间的性能差异可以忽略不计。这几乎完全是语法的偏好问题。

标准约定将涉及返回一个新字符串,而不是修改通过引用传递的参数。在某些情况下它更容易使用(即当您没有命名变量时;例如,当您想要传入方法或属性的返回值而不是字段时)。

于 2013-04-23T17:42:39.710 回答
1

差别不大,但我会选择“返回”。如果可能,尽量避免使用“ref”。

原因是您不必在传递另一个调用的结果之前声明变量,并且可以链接调用:

参考:

string modifyMe = GetMeString();
ModifyLints(ref modifyMe);
AddFakeImage(ref modifyMe);

与回报相比:

string result = AddFakeImage(ModifyLinks(GetMeString()));
于 2013-04-23T17:43:01.237 回答
1

如果您需要返回多个对象,请使用ref/ out,如果您return只需返回一个对象即可,请使用return.
ref使您的代码不必要地晦涩难懂,并产生在这种情况下不必要的写入开销。
您应该始终尽量保持您的代码简单且易于浏览。

于 2013-04-23T17:44:32.317 回答
1

我更喜欢像 builder 这样的东西:

新的 EmailMessageProcessor(html).WithModifiedLinks().WithFakeImages()。

所以没有 ref 参数,一切都被封装了。

于 2013-04-23T17:45:53.947 回答