Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
MakcPletnev
37 / 33 / 9
Регистрация: 01.02.2014
Сообщений: 790
Завершенные тесты: 1
1

Небезопасный код

24.08.2018, 12:55. Просмотров 374. Ответов 5

Всем привет, интересует такой вопрос. Мне нужно создать

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
public partial class MyForm : Form
{
Dictionary<string, BoxInfo*> Mas = new Dictionary<string, BoxInfo*>();
 
public class ItemInfo
        {
            public string host { get; set; }
 
            public string name;
            public string nameRus;
 
            public string i_classid;
            public string i_instanceid;
 
            public string priceTM = "Нажмите ";
            public string priceMarket = " чтобы ";
            public string priceOrder = " узнать";
            public string startPrice;
 
            public string maxPrice;
        }
        public class BoxInfo
        {
            public Guid Id { get; set; }
            public ItemInfo Info { get; set; }
 
            public void SaveFile()
            {
                lock (lockerFile)
                {
                    try
                    {
                            db.Upsert(this);
                    }
                    catch (Exception ex) { MessageBox.Show("Ошибка: " + ex.Message); }
                }
            }
        }
 
//----- дальше всякие функции и обработчики формы
}
Данные у меня хранятся и извлекаются из базы в List<BoxInfo> , для удобной работы с несколькими DataGridView таких списков несколько (для каждой таблицы свой список с одинаковыми индексами, т.е i-ая строка в таблице соответствует i-му элементу в List. Это мне нужно, чтобы например при сортировке таблицы по столбцам все индексы сохранялись - сначала сортирую массив, потом чищу таблицу и вывожу все элементы заново)
Кстати если кто-то знает на сколько такой подход правильный и что можно придумать для более удобной работы, буду благодарен за наводку

Но для быстрого поиска в нужный момент было решено использовать хеш таблицы, и чтобы не клонировать данные, я по старой памяти из c++ вспомнил про указатели, но вот беда, тут это еще сложнее
В общем вопрос в том, как создать данный Dictionary
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2018, 12:55
Ответы с готовыми решениями:

Небезопасный код в C#
Всем здравствуйте. Собственно есть задание: Задан стековый массив А(N, N). Поменять местами...

Безопасный и небезопасный код.
Есть некий класс unsafe class MyClass { //... public void SetKey(byte...

Небезопасный код: пример из книги не компилируется
Учу с# по книге Шилдта, в разделе про небезопасный код есть примеры работы с указателями, однако...

Небезопасный код. Битовое чтение файла и преобразование к определенному формату
Доброго времени суток. Решаю задачу битового чтения файла и преобразование к определенному...

SharpDevelop и небезопасный код
Привет всем. Подскажите пожалуйста как разрешить небезопасный код в SharpDevelop Поиск по форуму...

5
OwenGlendower
Супер-модератор
Эксперт .NET
11220 / 9452 / 4003
Регистрация: 17.03.2014
Сообщений: 18,915
Записей в блоге: 1
Завершенные тесты: 2
24.08.2018, 13:16 2
MakcPletnev, указатели здесь не нужны. BoxInfo это класс т.е. – ссылочный тип. Значит в переменной хранится ссылка (читай указатель) на значение.
0
MakcPletnev
37 / 33 / 9
Регистрация: 01.02.2014
Сообщений: 790
Завершенные тесты: 1
24.08.2018, 13:48  [ТС] 3
OwenGlendower, понял, а если бы была структура, то по сути я сэкономил бы на памяти с помощью указателей?
На счет таблицы в голову не приходит какого-то более правильного решения?

Добавлено через 13 минут
OwenGlendower, отбой по второму вопросу, нагуглил про
C#
1
2
3
4
 bindingSource = new BindingSource();
 bindingSource.DataSource = list;
 dataGridView1.AutoGenerateColumns = true;
 dataGridView1.DataSource = bindingSource;
Попробую, отпишусь по результату)
0
SeIZVeIZ
841 / 743 / 311
Регистрация: 08.02.2014
Сообщений: 2,248
Завершенные тесты: 3
24.08.2018, 13:50 4
Цитата Сообщение от MakcPletnev Посмотреть сообщение
а если бы была структура, то по сути я сэкономил бы на памяти с помощью указателей?
в новом шарпе вроде для экономии памяти ввели понятие как ref struct, но пока особо такое не тестил, однако много моментов в самом .net уже переписано на такое использование структур.
1
OwenGlendower
Супер-модератор
Эксперт .NET
11220 / 9452 / 4003
Регистрация: 17.03.2014
Сообщений: 18,915
Записей в блоге: 1
Завершенные тесты: 2
24.08.2018, 14:04 5
Цитата Сообщение от MakcPletnev Посмотреть сообщение
а если бы была структура, то по сути я сэкономил бы на памяти с помощью указателей?
Да, сэкономил бы, но потерял бы на скорости передачи значений. Плюс были бы труюности с модификацией этих значений.

Цитата Сообщение от SeIZVeIZ Посмотреть сообщение
в новом шарпе вроде для экономии памяти ввели понятие как ref struct
Здесь это не поможет т.к. ref структуры это stack-only тип.
0
MakcPletnev
37 / 33 / 9
Регистрация: 01.02.2014
Сообщений: 790
Завершенные тесты: 1
24.08.2018, 17:47  [ТС] 6
Если кому-то потребуется
Сделал свой BindingList с AddRange для удобства
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
public class MyBindingList<I> : BindingList<I>
        {
            private readonly List<I> _baseList;
 
            public MyBindingList() : this(new List<I>())
            {
 
            }
 
            public MyBindingList(List<I> baseList) : base(baseList)
            {
                if (baseList == null)
                    throw new ArgumentNullException();
                _baseList = baseList;
            }
 
            public void AddRange(IEnumerable<I> vals)
            {
                ICollection<I> collection = vals as ICollection<I>;
                if (collection != null)
                {
                    int requiredCapacity = Count + collection.Count;
                    if (requiredCapacity > _baseList.Capacity)
                        _baseList.Capacity = requiredCapacity;
                }
 
                bool restore = RaiseListChangedEvents;
                try
                {
                    RaiseListChangedEvents = false;
                    foreach (I v in vals)
                        Add(v); // We cant call _baseList.Add, otherwise Events wont get hooked.
                }
                finally
                {
                    RaiseListChangedEvents = restore;
                    if (RaiseListChangedEvents)
                        ResetBindings();
                }
            }
        }
Через get set проверяю валидность данных
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
public class BoxInfo
        {
            public Guid Id { get; set; }
 
            public string host;
 
            public string name { get; set; }
            public string nameRus { get; set; }
 
            public string _StartPrice {
                get { return _startPrice; }
                set
                {
                    _startPrice = value.ToString().Replace(".", ",");
                    double tmp;
                    if(double.TryParse(_startPrice, out tmp))
                    {
                        startPrice = tmp;
                        SaveFile();
                    }
                    else
                    {
                        _startPrice = "Ошибка";
                        startPrice = 0;
                        SaveFile();
                    }
                }
            }
            public string _startPrice { get; set; }
            public double startPrice { get; set; }
 
            public string _MaxPrice
            {
                get { return _maxPrice; }
                set
                {
                    _maxPrice = value.ToString().Replace(".", ",");
                    double tmp;
                    if (double.TryParse(_maxPrice, out tmp))
                    {
                        maxPrice = tmp;
                        SaveFile();
                    }
                    else
                    {
                        _maxPrice = "Ошибка";
                        maxPrice = 0;
                        SaveFile();
                    }
                }
            }
            public string _maxPrice { get; set; }
            public double maxPrice { get; set; }
 
            public void SaveFile()
            {
                lock (lockerFile)
                {
                    try
                    {
                            db.Upsert(this);
                    }
                    catch (Exception ex) { MessageBox.Show("Ошибка: " + ex.Message); }
                }
            }
        }
и коннкет к DataGridView. В настройках колонок надо прописать DataPropName

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
MyBindingList<BoxInfo> Mas = new MyBindingList<BoxInfo>();
 
dataGridView1.AutoGenerateColumns = false;
dataGridView1.DataSource = Mas;
 
 
BoxInfo tmp = new BoxInfo();
tmp.Id = new Guid();
tmp.host = linkGenerate.csHost;
tmp.name = "name";
tmp._StartPrice = "9.3";
 
 
MasCS.Add(tmp);
0
24.08.2018, 17:47
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2018, 17:47

небезопасный код (unsafe)
Столкнулся с проблемой: Visual Studio 2010 ругается на unsafe, а именно: &quot;ошибка CS0227:...

Небезопасный код, многоуровневая адресация - каково их назначение
Зачем она и с чем ее едят? Неужели бывают случаи когда нужно иметь адрес адреса? //с &quot;С&quot; знаком...

Небезопасный код с использованием указателей (операции с массивами)
Задан стековый массив А(N). Получить из него массив В(M), содержащий элементы массива А, кратные...


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

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

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