0

只是想问一下在 .NET Framewok (C#) 中使用具有 300 多个属性的对象的缺点(我的意思是内存或响应时间)。

我正在考虑将不同类中的属性分开,但我的问题是属性之间没有很大的关系。

我不会做任何复杂的计算,我只会填充 instatiaded 对象的属性并将他发送到另一个程序,该程序将把他送回去。

你觉得怎么样

EDIT

在运行我的程序时,我将只有一个对象。

4

3 回答 3

10

最大的缺点:可读性

具有 300 个属性的类(我假设您的意思是属性,因为 .NET 属性具有特定的技术含义)太大而无法阅读和理解。如果,如您所说,您应该the attributes don't have a big relation between them寻找如何将它们分解为更小的相关项目类别。

您的描述:

我不打算做任何复杂的计算,我只会填充 instatiaded 对象的属性并将他发送到另一个程序,该程序将把他送回去。

这似乎表明需要在系统之间传递一个 DTO(数据传输对象) - 我再次认为,您应该考虑将对象分解为几个(因此,如果相关项目发生变化,您不必更改整个界面)。

于 2012-06-19T15:45:39.713 回答
1

不,我认为不会。Infragistics ultragrid 拥有大约(我的近似)不到一千种属性和方法。并且运行正常。现在,如果您将其中的 10 个控件放在您的程序中会怎样。也没什么区别。我认为可以安全地假设您可以添加任意数量的内容,因为如果您至少有未使用的 1GB 内存空间,

这只是我的近似值,您也可以拥有自己的:1 个属性,平均 250 个字节(1 个字符 = 2 个字节)所以,

1 073 741 824/250 字节 = 4 294 967.3 属性

此外,您还拥有 HD 的虚拟内存作为备份。

于 2012-06-19T16:05:39.637 回答
0

一个词:抽象

如果你有一个包含 300 个属性的大类,那么在整个项目中你只有一个大的抽象抽象。

您可能是唯一使用它的人,但可能几年后,当您必须返回并更改某些内容时,您可能会对您所做的事情感到困惑。

下面的这个类很好,但它可能会遗漏一些功能。

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string FullName { get; set; }
    public char Gender { get; set; }
    public string Social { get; private set; }
}

所有这些属性都可以在函数式程序中使用,但您可以为自己提供更多功能。

下面的示例被重构为将 Social 抽象为它自己的类SSN

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string FullName { get; set; }
    public char Gender { get; set; }
    public SSN Social { get; private set; }
}

public class SSN
{
    public const int SSN_LENGTH = 9;

    public string FirstThree { get; set; }
    public string MiddleTwo { get; set; }
    public string LastFour { get; set; }

    public SSN(string ssn)
    {
        FirstThree = ssn.Substring(0, 3); 
        MiddleTwo = ssn.Substring(2, 2);
        LastFour = ssn.Substring(5, 4);
    }

    public string ToString(bool format = false)
    {
        string formatDelimiter = "";
        if (format)
        {
            formatDelimiter = "-";
        }

        return FirstThree + formatDelimiter + MiddleTwo + formatDelimiter + LastFour;
    }
}

通过将 Social 抽象为一个SSN类,我现在可以对社会安全号码进行更多控制并添加功能。当我通过他们社交的最后四个人寻找一个人时,我可以轻松地使用以下代码:

string lastFour = "0000";
List<Person> Persons = new List<Person>();
Person foundPerson = Persons.Where(x => x.Social.LastFour == lastFour).First();

这只是一个小例子,它可以扩展到更复杂的部分。这将为系统提供更好的功能,并且也更容易理解。

于 2012-06-19T16:19:13.420 回答