Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
122 / 2 / 0
Регистрация: 04.02.2025
Сообщений: 69

Запрет редактирования элементов извне класса

25.08.2025, 01:13. Показов 2861. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Столкнулся со следующей проблемой.
В классе myclass работаю с Ethernet-ом. По приходу очередного кадра извлекаю из него информацию и на основе неё создаю объект класса cell и помещаю его в список List. Этот список передаётся во вне для отображения его в интерфейсе программы на экране.
Задача состоит в том что хотелось бы заблокировать за пределами класса myclass как редактировать сам список так и поля элементов списка. Притом одно поле Check для изменения должно быть доступно.
Никак не могу понять как это сделать, спрашивал у нейросити - рабочих вариантов не выдаёт, складывается ощущение что такого вообще добиться нельзя.

Привожу код для наглядности. В коде метод CreateList() вызывается из метода Main() для упрощения примера, в рабочей программе он вызывается при приёме Eth-какдра.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
using System;
using System.Collections.Generic;
 
class myclass
{
    public class cell
    {   
        public int Number;
        public string Type;
        public bool Check;
    }
    
    public List<cell> Cells = new List<cell>();
    
    public void CreateList()
    {
        Cells.Add(new cell());
        Cells.Add(new cell());
        
        Cells[0].Number = 1;
        Cells[0].Type = "A";
        Cells[0].Check = false;
        
        Cells[1].Number = 2;
        Cells[1].Type = "B";
        Cells[1].Check = false;
    }
}
 
class Program
{   static void Main()
    {
        myclass MyObj = new();
        MyObj.CreateList();
 
        foreach(myclass.cell Cell in MyObj.Cells)
        {
            Console.WriteLine($" {Cell.Number}, {Cell.Type}, {Cell.Check}");
        }
 
        MyObj.Cells.Add(new myclass.cell());    //изменение состава списка не должно работать!!!
        MyObj.Cells[0].Number = 1000;           //изменения элементов списка не должно работать!!!
        MyObj.Cells[0].Check = true;            //кроме одного, этот менять можно!
    }
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.08.2025, 01:13
Ответы с готовыми решениями:

Привязка к свойству и возможность редактирования извне
Всем доброго времени суток! Возникла дилемма. У меня есть 3 TextBox, при изменении TextBox2.Text...

Запрет редактирования DataGridView
Как запретить редактировать определенные ячейки?

Запрет редактирования DataGridView на форме
Собственно вопрос, как можно запретить редактирование динамически созданной DGV непосредственно с...

23
122 / 2 / 0
Регистрация: 04.02.2025
Сообщений: 69
02.09.2025, 02:16  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Wolfdp Посмотреть сообщение
дык и без этой писанины вычисляется на раз. Или вы code repository не используете?
Вычислить можно как раз благодаря тому, что оригинал сохраняется в надёжном месте. А вот если он из своего кода мой список попортит тут уже никакой code repository не поможет.

Цитата Сообщение от Wolfdp Посмотреть сообщение
Учитывая что вы так особо и не расписали суть задачи
Расписал всё в первом посте, как ещё подробнее - не знаю. Спрашивайте конкретнее.

Цитата Сообщение от Wolfdp Посмотреть сообщение
Конструктор ограничивать я тут вообще не вижу смысла. Разве что у вас одна модель на всё и вся, и public field подсказывает что где-то оно так и есть.
Тут я вообще не понял, что вы хотели сказать.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
02.09.2025, 03:29

Не по теме:

Цитата Сообщение от Jack0v Посмотреть сообщение
А вот если он из своего кода мой список попортит тут уже никакой code repository не поможет.
Вы ТОЧНО знаете как работает тот же git и его возможности? Это далеко не только "залить файл в облако".



Цитата Сообщение от Jack0v Посмотреть сообщение
Спрашивайте конкретнее.
cell нужно менять в процессе жизни этого объекта? Если "нет" -- используем record или его аналог в виде класса с свойствами, которые инициализируются при создании, и не изменяются в дальнейшем. То что где-то там можно создать отдельно ваш Cell минуя ваш myclass -- вообще фиолетово.

Второй вопрос -- у вас манипуляция списком происходит только в MyClass? Если "да", то List<cell> Cells меняем на такое

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public record Cell(int Nubmer, string Type, bool Check);
 
public class MyClass
{ 
    private readonly List<Cell> _cells;
    private readonly IReadOnlyList<Cell> _readonlyCells;
 
    public IReadOnlyList<Cell> Cells => _readonlyCells;
 
    public MyClass()
    {
        _cells = [];
        _readonlyCells = _cells.AsReadOnly();
    }
 
    public void FillList()
    {
        _cells.AddRange([
            new Cell(1, "A", false),
            new Cell(2, "B", true)]);
    }
}
Почему две штуки, а не просто как в примерах выше. Дело в том что если реально боитесь что кто-то полезет, то банальный каст к IReadOnlyList "обратим" с помощью явного приведения к List

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var nya = new Nya();
var list = (List<int>)nya.List;
list.Add(2); // магия больше не работает, мы можем добавить в закрытый список
 
class Nya
{
    private readonly List<int> _list;
    
    public IReadOnlyList<int> List => _list;
 
    public Nya()
    {
        _list = new();
    }
}
Можно конечно оставить и так, учитывая что явный каст в коде очень нежелательно использовать в таком виде и нужно спрашивать в первую очередь за него.

Если вам нужно править ваши Cell в многих классах -- пример я скидывал ранее. В вашем случае нужно будет вместо Neko создать класс реализующий IReadOnlyList<Cell>, но при этом имеющий дополнительные методы/свойства для модификации внутренностей, доступные только избранным классам.

Что самое забавное, вам большую часть этого указали ещё в первом ответе, просто в несколько "ужатом" виде. Как-то так...
0
122 / 2 / 0
Регистрация: 04.02.2025
Сообщений: 69
03.09.2025, 00:27  [ТС]
Цитата Сообщение от Wolfdp Посмотреть сообщение
cell нужно менять в процессе жизни этого объекта?
Конечно. А разве можно менять и за пределами жизни?


Цитата Сообщение от Wolfdp Посмотреть сообщение
у вас манипуляция списком происходит только в MyClass
Цитата Сообщение от Jack0v Посмотреть сообщение
хотелось бы заблокировать за пределами класса myclass как редактировать сам список так и поля элементов списка


Цитата Сообщение от Wolfdp Посмотреть сообщение
вам большую часть этого указали ещё в первом ответе,
Ну так я полностью удовлетворился ответом в сообщении 9.


Цитата Сообщение от Wolfdp Посмотреть сообщение
Если вам нужно править ваши Cell
Из внешнего кода надо разрешить править только одно поле Check этого Cell. Но как это сделать я уже догадался и сам.


Не по теме:

Цитата Сообщение от Wolfdp Посмотреть сообщение
Вы ТОЧНО знаете как работает тот же git и его возможности? Это далеко не только "залить файл в облако".
А как злопыхателю, или просто по запарке, git помешает написать что-то вроде MyObj.Cells.Clear();?

0
03.09.2025, 01:52

Не по теме:

Цитата Сообщение от Jack0v Посмотреть сообщение
А как злопыхателю, или просто по запарке, git помешает написать что-то вроде MyObj.Cells.Clear();?
Выставляется запрет на мерж в основную ветку без апрувов. Релизный код собирается только из основной ветки, когда всё протестировали и утвердили. Тут конечно не в одном git вопрос, а скорее в организации всего процесса написания и развёртывания продукта. Крайне желательный подход, который не очень жалуют в первую очередь заказчики, т.к. считают что код должен исключительно писаться, а читать что там написано оплачивать не стоит.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.09.2025, 01:52

Запрет редактирования столбца DataGrid
Добрый день всем! Весь день убил на решение такой проблемы: вставляю в DataGrid DataTable: ...

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

Запрет редактирования определенных колонок в DataGridView
Здравствуйте! Подскажите как запретить редактирование определенных колонок в DataGridView

Запрет редактирования файла
Добрый день. Программа создает некоторый файл, необходимо запретить пользователю открывать его(или...

Запрет редактирования
Здравствуйте. Имеется проблема данного характера: Есть приложение WF, компонент DataGridView(в...


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

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Новые блоги и статьи
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru