C# 使用多个函数构建stringbuilder变量

C# 使用多个函数构建stringbuilder变量,c#,.net,performance,function,architecture,C#,.net,Performance,Function,Architecture,我目前有一个函数,可以使用对象创建stringbuilder变量 我现在面临的问题是,这个函数非常长,我开始意识到,为了可读性和可能的可维护性,我可以很容易地将它拆分为多个函数。有什么理由不把它们分成不同的职能吗?会有性能提升还是相反 下面是我正在使用的当前stringbuilder函数的一个较小版本(因为它大约有300多行代码)。如您所见,我可以根据每行输入将函数拆分为: private static StringBuilder GetObjectData(Object obj) {

我目前有一个函数,可以使用对象创建stringbuilder变量

我现在面临的问题是,这个函数非常长,我开始意识到,为了可读性和可能的可维护性,我可以很容易地将它拆分为多个函数。有什么理由不把它们分成不同的职能吗?会有性能提升还是相反

下面是我正在使用的当前stringbuilder函数的一个较小版本(因为它大约有300多行代码)。如您所见,我可以根据每行输入将函数拆分为:

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上?即使我走的是另一条路,从技术上讲,您的解决方案是对我提出的问题的回答!谢谢