Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
4 / 4 / 4
Регистрация: 30.01.2015
Сообщений: 120
1

Как правильно инкапсулировать массив?

07.04.2017, 20:07. Показов 1237. Ответов 6
Метки нет (Все метки)

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        class cla
        {
            private int[] m = new int[] { 1 };
            public int[] M
            {
                get { return m; }
            }
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            cla d = new cla();
            int[] c = d.M;
            c[0] = 2;
            MessageBox.Show(d.M[0].ToString());
        }
Вывод : 2

Как сделать так, чтобы массив не изменялся?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.04.2017, 20:07
Ответы с готовыми решениями:

Как инкапсулировать массив
Кто подскажит как инкапсулировать массив: int a = new int; a = 0; a = 2; a = 4; a...

Как инкапсулировать массив?
public class Player_class { ... private byte round_fixed_level = new byte; ...

Инкапсулировать класс
Помоги пожалуйста передалать класс на работу с аксессорами using System; using...

Зачем всегда инкапсулировать переменные в свойства
Давно хотел спросить. Вопрос возникает постоянно, когда я вижу код типа такого: class cls {...

6
2264 / 1722 / 511
Регистрация: 02.08.2011
Сообщений: 4,914
07.04.2017, 20:16 2
Лучший ответ Сообщение было отмечено Roma12 как решение

Решение

Возвращать readonly коллекцию.
C#
1
2
3
4
5
class Test
    {
        private int[] mas = new int[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        public ReadOnlyCollection<int> Massive => new ReadOnlyCollection<int>(mas);
    }
Вот тут намного более развернутый ответ.
1
Модератор
Эксперт .NET
5734 / 4632 / 2919
Регистрация: 20.04.2015
Сообщений: 8,273
07.04.2017, 20:18 3
Roma12,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class cla
{
    private int[] m = new int[] { 1 };
    public int this[int index]
    {
        get { return m[index]; }
    }
}
 
private void button1_Click(object sender, EventArgs e)
{
    cla d = new cla();
    //d[0] = 2; - не получится!
    MessageBox.Show(d[0].ToString());
}
1
4 / 4 / 4
Регистрация: 30.01.2015
Сообщений: 120
08.04.2017, 13:28  [ТС] 4
Цитата Сообщение от IamRain Посмотреть сообщение
Возвращать readonly коллекцию.
А если сделать так?
C#
1
2
3
4
5
6
7
8
        class cla
        {
            private int[] m = new int[] { 1 };
            public int[] M
            {
                get { return (int[])m.Clone(); }
            }
        }
Будет ли этот код быстрее? Более экономным в памяти?
0
2264 / 1722 / 511
Регистрация: 02.08.2011
Сообщений: 4,914
08.04.2017, 13:37 5
Лучший ответ Сообщение было отмечено Roma12 как решение

Решение

Нет, не будет. В обоих случаях создается новый объект.
Поэтому может быть overhead при интенсивном использовании этого свойства с большими коллекциями.
К тому же возвращаемую коллекцию можно изменять, то есть это неправильный ответ.

Добавлено через 3 минуты
Хотя изменение коллекции при клонировании особого смысла не несет, все же лучше более явно показывать свои намерения при проектировании классов.
1
4 / 4 / 4
Регистрация: 30.01.2015
Сообщений: 120
15.04.2017, 13:30  [ТС] 6
Цитата Сообщение от IamRain Посмотреть сообщение
Поэтому может быть overhead при интенсивном использовании этого свойства с большими коллекциями.
У меня будет массив из 5 элементов, максимум 6. С таким размером при интенсивном использовании будет overhead?
0
62 / 64 / 14
Регистрация: 25.03.2017
Сообщений: 156
15.04.2017, 15:02 7
Roma12, нет, overhead будет именно при обработке больших коллекций, 5-6 элементов это далеко не большая.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.04.2017, 15:02

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Как правильно создать массив?
Имеются два числа, a=6 и c=2. 6 - это число элементов на схеме, 2 - это число рядов в этой схеме....

Как правильно инициализировать массив?
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data;...

Как правильно заполнить массив
как запонить массив names1. значениемя name? чтоб потом я смог вывести результат. допустим ...

Как правильно описать массив
Как правильно описать в СИ# массив с размерностью 2*n


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.