我正在研究引用类型与值类型。
引用类型的返回值和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?
答案 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不会带来任何好处。虚空会更合适。