引用类型值返回与空值(非值返回)功能

时间:2019-09-04 09:46:47

标签: c#

我正在研究引用类型与值类型。

引用类型的返回值和void函数之间是否有区别 示例FooSb与FooSb2的内存地址,内存类型,代码质量,设计模式等。

  

编辑:StringBuilder只是引用类型对象的示例

public class Program
{
    static void Main(string[] args)
    {
        StringBuilder sb;
        Stopwatch stopwatch;
        Foo foo = new Foo();

        Console.WriteLine($"BEFORE : {1}"); // 1

        sb = new StringBuilder("1");
        stopwatch = Stopwatch.StartNew();
        stopwatch.Start();
        foo.FooSb(sb);
        stopwatch.Stop();
        Console.WriteLine($"AFTER FooSb : {sb.ToString()}\t{stopwatch.Elapsed}"); // -1

        sb = new StringBuilder("1");
        stopwatch = Stopwatch.StartNew();
        sb = foo.FooSb2(sb);
        stopwatch.Stop();
        Console.WriteLine($"AFTER FooSb2 : {sb.ToString()}\t{stopwatch.Elapsed}"); // -1


        Console.ReadLine();
    }

    public class Foo
    {
        public void FooSb(StringBuilder sb)
        {
            sb.Clear().Append("-1");
        }
        public StringBuilder FooSb2(StringBuilder sb)
        {
            return sb.Clear().Append("-1");
        }
    }
}

输出

 - BEFORE       :  1 
 - AFTER FooSb  : -1       00:00:00.0001358 
 - AFTER FooSb2 : -1       00:00:00.0000971
  

例如:

     

我有一个引用类型的对象。我会改变的价值   对象使用另一个功能。价值是否会随功能而变化   是否使用return。为什么要使用return?

1 个答案:

答案 0 :(得分:1)

如果问题是为什么要像注释中所述的那样返回FooSb2中的StringBuilder,那么您可以链接函数。

就性能而言,差异可能微不足道。选择无效vs收益与性能无关。相反,通过选择返回而不是使用void,可以使使用该类更加容易。

事实上,StringBuilder本身遵循这种模式。 StringBuilder的Append方法返回其自身的实例。它的功能定义类似于:

public StringBuilder Append(string str)
{
    // append logic, etc.
    return this;
}

因此,这使您可以做到这一点:

var sb = new StringBuilder("1").Append("2").Append("3");

如果Append方法返回void,则必须改为:

var sb = new StringBuilder();
sb.Append("1");
sb.Append("2");
sb.Append("3");

但是,在您提供的示例中,使用FooSb2没有多大意义。

public class Foo
{
    public void FooSb(StringBuilder sb)
    {
        sb.Clear().Append("-1");
    }
    public StringBuilder FooSb2(StringBuilder sb)
    {
        return sb.Clear().Append("-1");
    }
}

如果要“链接” FooSb2,则必须这样做:

FooSb2(FooSb2(FooSb2(sb)))

因此,在这种特殊情况下,返回StringBuilder不会带来任何好处。虚空会更合适。

相关问题