C# 使用多个函数构建stringbuilder变量
我目前有一个函数,可以使用对象创建stringbuilder变量 我现在面临的问题是,这个函数非常长,我开始意识到,为了可读性和可能的可维护性,我可以很容易地将它拆分为多个函数。有什么理由不把它们分成不同的职能吗?会有性能提升还是相反 下面是我正在使用的当前stringbuilder函数的一个较小版本(因为它大约有300多行代码)。如您所见,我可以根据每行输入将函数拆分为:C# 使用多个函数构建stringbuilder变量,c#,.net,performance,function,architecture,C#,.net,Performance,Function,Architecture,我目前有一个函数,可以使用对象创建stringbuilder变量 我现在面临的问题是,这个函数非常长,我开始意识到,为了可读性和可能的可维护性,我可以很容易地将它拆分为多个函数。有什么理由不把它们分成不同的职能吗?会有性能提升还是相反 下面是我正在使用的当前stringbuilder函数的一个较小版本(因为它大约有300多行代码)。如您所见,我可以根据每行输入将函数拆分为: private static StringBuilder GetObjectData(Object obj) {
private static StringBuilder GetObjectData(Object obj)
{
StringBuilder sb = new StringBuilder();
sb.AppendLine(("TempClass;" +
obj.TempClass.TempValue +
obj.TempClass.TempValue1 +
obj.TempClass.TempValue2 +
obj.TempClass.TempValue3 +
obj.TempClass.TempValue4 +
obj.TempClass.TempValue5 +
obj.TempClass.TempValue6 +
obj.TempClass.TempValue7 +
obj.TempClass.TempValue8));
sb.AppendLine(("TempClass2; +
obj.TempClass2.TempValue));
sb.AppendLine(("TempClass3;" +
obj.TempClass3.TempValue));
if (obj.TempClass3.TempValue != null && obj.TempClass3.TempValue1 != null)
{
sb.AppendLine(("TempClass3;" +
obj.TempClass3.TempValue +
obj.TempClass3.TempValue1));
}
sb.AppendLine(("TempClass4;" +
obj.TempClass4.TempValue));
foreach (string element in obj.TempClass5.TempValue)
{
sb.AppendLine(("TempClass5;" + element));
}
return sb;
}
非常感谢您的任何意见 您可以对每个子类使用toString Builder(StringBuilder sb)方法。这将附加到传递的StringBuilder,然后您将保持使用StringBuilder的好处,如下所示:
private static StringBuilder GetObjectData(MyObject obj)
{
StringBuilder sb = new StringBuilder();
obj.ToStringBuilder(ref sb);
return sb;
}
class MyObject
{
MySubObject Object1;
MySubObject Object2;
public void ToStringBuilder(ref StringBuilder sb)
{
if (Object1 != null)
{
sb.AppendLine(Object1.ToStringBuilder(ref sb));
}
if (Object2 != null)
{
sb.AppendLine(Object2.ToStringBuilder(ref sb));
}
}
}
class MySubObject
{
object Field1;
object Field2;
public void ToStringBuilder(ref StringBuilder sb)
{
if (Field1 != null)
{
sb.AppendLine(Field1.ToString());
}
if (Field2 != null)
{
sb.AppendLine(Field2.ToString());
}
}
}
如果函数有助于提高可维护性和可读性,那么您肯定应该拆分此代码
如果知道要在类中附加所有参数/字段,可以将代码缩短为(技术上)一行:
myclass.GetType()
.GetProperties() //or .GetFields()
.OrderBy(x => x.Name)
.Where(x => ....) //optional
.Select(x => { sb.Append(x.GetValue(myclass).ToString()); return x; })
.ToList();
这很可能会降低您的性能,因此,如果对您来说足够好,请先进行一些测试
还有一个
#region somedescription
+#endregion
,可以使代码更具可读性。如果目标只是获取任意对象的字符串表示,则可以将该对象序列化为JSON:
private static StringBuilder GetObjectData(Object obj)
{
string json = JsonConvert.SerializeObject(obj);
return new StringBuilder(json);
}
您可能会有更好的运气,因为额外的函数调用可能会稍微(非常轻微)增加所消耗的时间。但与处理过程相比,它是如此微小,以至于它与处理无关。可读性和可维护性应始终是第一倾向。只有在出现问题时才担心性能。您调用此函数多少次?如果不是以百万计,那么就没有多大区别。在任何地方使用
+
都无法达到使用StringBuilder的目的。@Dennis\u一点也不。当编译时已知要连接的字符串数时,最好使用字符串连接<代码>StringBuilder仅在编译时不知道concat的字符串数时才有用。考虑到他在编译时将一个固定已知数字的字符串进行压缩,并且在数字未知时使用StringBuilder
,他做得完全正确。他的解决方案比附加所有这些字符串更可取。这是一种方法,但我实际上有20多个子类。不同的文件格式将使用不同的StringBuilder,我使用这个对象和子对象作为中性格式来读取和写入所有转换。所以不确定这是否是最好的解决方案。@Baraa如果您的某些类使用.ToString(),您可以将其用于它们,并将其结果附加到StringBuilder上?即使我走的是另一条路,从技术上讲,您的解决方案是对我提出的问题的回答!谢谢