Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/14: Рейтинг темы: голосов - 14, средняя оценка - 4.93
2 / 2 / 5
Регистрация: 06.04.2010
Сообщений: 176

передача массив как ссылку в классе

29.07.2010, 14:42. Показов 2993. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Создан класc, где со временем будет добавляться массивы, но операции над ними одни и тежи, необходимо выполнить дествие над выбранном массовом
массив передпологаеться получать методом GetParametr(string inParametr) и будет возрашать ссылку на выбранный массив, потом над ним проводяться изменения

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
public class BSCv033
{
    public BSCv033()
    {
        int[] Parametr_Razmer = new int[0];
        int[] Parametr_Tip = new int[0];
     }
 
    //========================================================
    private int[] iParametr;
 
    public int[] Parametr_Razmer;
    public int[] Parametr_Tip;
    
    //- - - - - -
 
 
    private int[] GetParametr(string inParametr) // возрашает массив типа 
    {
        if (inTip == "Razmer") return this.Parametr_Razmer;
        if (inTip == "Tip") return this.Parametr_Tip;
 
        int[] temp = new int[0];
        return temp;
    }
 
    public string ADDParametr(string inParametr, int inParametrOut)
    {
        [B]iParametr = this.GetParametr(inParametr); [/B]// получаем массив
                                 // !! не возрашает ссылку на массив
 
        iParametr = new int[10];
        iTip[0] = inParametrOut;
        return "OK";
    }
}
помогите привести код в рабочий вид ))
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.07.2010, 14:42
Ответы с готовыми решениями:

Как получить ссылку на объект (структуру) в другом классе
Долгое время об этом не задумывался, т.к. программы были маленькие, но теперь у меня несколько классов и интерфейсов в разных файлах .cs,...

Как правильно задать массив в классе Student
Добрый вечер!Подскажите, пожалуйста, как мне правильно задать массив в классе Student (в конструкторе), чтобы я смог его вызвать потом в...

Ступенчатый массив как поле в некотором классе
Каким образом мне организовать этот кусок кода, чтобы он мог работать не только в определенном методе, но был полем класса? int myArr...

7
Администратор
 Аватар для mik-a-el
87861 / 53182 / 249
Регистрация: 10.04.2006
Сообщений: 13,765
29.07.2010, 14:48
Цитата Сообщение от nchameleon Посмотреть сообщение
// !! не возрашает ссылку на массив
А что возвращает? И что передаете в inParametr?
Цитата Сообщение от nchameleon Посмотреть сообщение
iParametr = new int[10];
Это зачем сразу после получения массива с помощью this.GetParametr?

Добавлено через 48 секунд
Цитата Сообщение от nchameleon Посмотреть сообщение
private int[] GetParametr(string inParametr)
Вместо строки советую использовать enum - проще и нагляднее.
0
2 / 2 / 5
Регистрация: 06.04.2010
Сообщений: 176
29.07.2010, 17:33  [ТС]
inParametr (т.е. inTip ) - название таблицы над которой надо произвести изменения

в методе ADDParametr() - происходим манипуляция с выбранной таблицой( методом GetParametr()) более сложные чем в примере

а возрашает копию объекта а не ссылку на объект, так что какие бы ни делал изменения с iParametr в методе ADDParametr все равно оригинальная таблица(массив) не меняеться
пробовал даже так

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private void GetParametr(string inTip, ref int[] iParametr) // возрашает массив типа 
    {
        if (inTip == "Razmer") inParametr = this.Parametr_Razmer;
        if (inTip == "Tip") inParametr = this.Parametr_Tip;
    }
 
    public string ADDParametr(string inParametr, int inParametrOut)
    {
        this.GetParametr(inParametr, ref iParametr ); // получаем массив
                                 // !! не возрашает ссылку на массив
 
        iParametr = new int[10];
        iTip[0] = inParametrOut;
        return "OK";
    }
все равно в методе ADDParametr iParametr получает копию данных

Добавлено через 2 минуты
ИСПРАВЛЕНН КОД:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private int[] GetParametr(string inTip ) // возрашает массив типа 
    {
        if (inTip == "Razmer") return this.Parametr_Razmer;
        if (inTip == "Tip") return this.Parametr_Tip;
 
        int[] temp = new int[0];
        return temp;
    }
 
    public string ADDParametr(string inParametr, int inParametrOut)
    {
        [B]iParametr = this.GetParametr(inParametr); [/B]// получаем массив
                                 // !! не возрашает ссылку на массив
 
        iParametr = new int[10];
        iTip[0] = inParametrOut;
        return "OK";
    }
0
 Аватар для Mikant
1322 / 995 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
29.07.2010, 20:41
тут строго нарушена логика ссылок. но не отчаивайтесь, все это проходили
я уж не буду говорить, что в первом посте после строк 5 и 6 значения Parametr_Razmer и Parametr_Tip вообще не изменятся, что они не приватны (что нарушает инкапсуляцию), и что Parameter и прочее, а скажу Вам лишь то, что происходит прямо на самом видном месте (отчего оно и не видно):

в методе ADDParametr
1) сначала переменной iParameter присваивается значение ссылки на Parametr_Razmer (то, что вернул метод GetParametr)
2) потом переменной iParameter присваивается значение ссылки на новый экземпляр класса int[]
так почему же iParameter должен помнить ссылку на старый массив?? - он в одну сторону смотрит

для таких ситуаций есть слово ref (см. msdn), или что проще - класс Array (например он умеет по ссылке менять размер существующего массива (тоже через ключевое слово ref))

если п.1 и(или) п.2 не понятен(ны), то приведу аналогию: у Вас в руке может быть только одна мыша, и, если надо взять другую, текущую придется отложить, а не видоизменить старую для их спаривания
0
2 / 2 / 5
Регистрация: 06.04.2010
Сообщений: 176
29.07.2010, 21:32  [ТС]
использовал следующий вид код
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private void GetParametr(string inTip, ref int[] iParametr) // возрашает массив типа 
    {
        if (inTip == "Razmer") inParametr = this.Parametr_Razmer;
        if (inTip == "Tip") inParametr = this.Parametr_Tip;
    }
 
    public string ADDParametr(string inParametr, int inParametrOut)
    {
        this.GetParametr(inParametr, ref iParametr ); // получаем массив
                                 // !! не возрашает ссылку на массив
 
        iParametr = new int[10];
        iTip[0] = inParametrOut;
        return "OK";
    }
по идее в методе ADDParametr()
this.GetParametr(inParametr, ref iParametr );
после iParametr будет ссылаться туда куда скажут

========================================

если все не верно/ как можно написать по другомуб в С# нелзя использовать ссылки на прямую

Добавлено через 1 минуту
PS: Я как раз и хочу выбрать нужную мне мышку по ее названию и ее юзать
0
 Аватар для s-kvv
76 / 73 / 9
Регистрация: 09.06.2010
Сообщений: 206
30.07.2010, 08:47
Цитата Сообщение от nchameleon Посмотреть сообщение
Создан класc, где со временем будет добавляться массивы, но операции над ними одни и тежи, необходимо выполнить дествие над выбранном массовом
массив передпологаеться получать методом GetParametr(string inParametr) и будет возрашать ссылку на выбранный массив, потом над ним проводяться изменения
Для хранения массивов и доступа к ним по значению строки можно использовать словарь
C#
1
2
3
4
5
6
7
8
9
Dictionary<string, int[]> d = new Dictionary<string, int[]>();
d.Add("my1",new int[10]);
d.Add("my2",new int[40]);
int[] my1 = d["my1"];
int[] my2 = d["my2"];
if(d.Remove("my1"))
{
      // "my1" удален из словаря
}
0
2 / 2 / 5
Регистрация: 06.04.2010
Сообщений: 176
30.07.2010, 15:42  [ТС]
Спасибо за совет, я пока с ним еще не разобрался, но все же можно реализовать что-то похожее на мою конструкцию. а то придеться переписывать весь класс, фактически писать приложение за ново и в разы вольше кода, пофторять типовые части кода много раз
0
 Аватар для s-kvv
76 / 73 / 9
Регистрация: 09.06.2010
Сообщений: 206
30.07.2010, 16:35
Цитата Сообщение от nchameleon Посмотреть сообщение
если все не верно/ как можно написать по другомуб в С# нелзя использовать ссылки на прямую
переменная класса - это ссылка
но все же можно реализовать что-то похожее на мою конструкцию.
как вариант - можно оставить ваши существующие методы и использовать их как оболочку + изменить их реализацию что бы не менять их взаимодействия (интерфейс) с другими методами
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.07.2010, 16:35
Помогаю со студенческими работами здесь

Как в классе создать поле массив массивов?
Пробовал вот так сделать но это не правильно. class Kcar { private string index = new string; public string...

В одном классе нужно создать массив, а в классе program его вывести. "Не все ветви кода возвращают значение"
В одном классе нужно создать массив, а в классе program его вывести, помогите, как разобраться namespace con { class Array ...

Передача параметра в абстрактном классе
В задании нужно написать абстрактный класс n-мерный вектор. Суть в том, что я не знаю, как указать этот параметр в классе. Сначала сделал...

Как в аргументы функции занести ссылку на массив объектов?
Возможно я не корректно выразился т.к. не знаю как этот процесс происходит (по этому и спрашиваю :) ). Я создаю массив объектов: ...

Как передать в качестве аргумента функции ссылку на массив
Приветствую. Из названия я думаю вопрос понятен, но я поясню. Есть функция которая на выходе выдаёт массив, но мне не нужно чтобы она...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru