Сколько данных фактически отправляется / сохраняется, когда вы ссылаетесь на один класс в другом? - PullRequest
1 голос
/ 26 февраля 2012

У меня есть два класса, один имеет много свойств, а другой - пару. Мне нужно сослаться на некоторые свойства большего класса в меньшем классе, но мне интересно, было бы лучше просто передать значения по отдельности. Пример:

public class LargeClass
{
    private string _var1;
    private string _var2;
    private string _var3;
    //...
    private string _var20;
    //stuff
}

public class SmallClass
{
    private LargeClass _largeclass;
    private string _var1;

    public SmallClass(LargeClass LargeClass)
    {
        _largeclass = LargeClass;
        _var1 = _largeclass.Var1 + _largeclass.Var2;
    }
}

Или я мог бы сделать это для небольшого класса и передать нужные мне значения напрямую:

public class SmallClass2
{
    private string _var1;
    private string _var2;
    private string _var3;

    public SmallClass2(string Var1, string Var2)
    {
        _var1 = Var1;
        _var2 = Var2;
        _var3 = _var1 + _var2;
    }
}

По сути, мой вопрос: какой из них занимает меньше места (как во время работы, так и при сериализации)?

Обновление: Я смог переписать мои классы так, чтобы меньшие объекты класса ссылались на свои родительские объекты и обнаружили, что он определенно использует меньше места при сериализации. Очевидно, что этот результат является индивидуальным, но для своего кода я в основном менял его для каждого экземпляра небольшого класса, хранящего путь к файлу в виде строки, на класс, способный создавать строку пути на лету, используя ссылки на родительские объекты .

Полученный файл сериализованных данных был на 55% меньше.

Ответы [ 3 ]

2 голосов
/ 26 февраля 2012

Во время работы они будут использовать одинаковое количество места, поскольку они являются просто ссылочными переменными (все указывают на одну и ту же область памяти). Если вы сериализуете данные - тогда вы увидите больше издержек, сериализовав больший класс.

1 голос
/ 26 февраля 2012

В этом случае я бы не беспокоился о пространстве сериализации (кроме случаев, когда вам нужно сериализовать тысячи экземпляров).

Я бы больше сосредоточился на использовании типов и обслуживании.Например, если вы хотите, чтобы меньший класс содержал значения свойств, какими они были во время создания экземпляра, я скопирую значения.В противном случае я бы использовал ссылку на больший тип.Таким образом, меньший тип получит все изменения в полях.Я бы также заменил «_var1 + _var2» свойством, если только «_var1» и «_var2» никогда не изменятся.

1 голос
/ 26 февраля 2012

Они будут использовать почти одинаковую память. Передача по ссылке создает указатель на объект, поэтому дополнительная память не используется, кроме пространства кучи, необходимого для указателя. Что касается сериализации, опция B может занять немного меньше места, если вы используете стандартную двоичную сериализацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...