Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.12.2012, 01:32   #1
artemoning
Пользователь
 
Регистрация: 20.09.2012
Сообщений: 23
По умолчанию Ссылки в C#

Как сделать так что бы два объекта одинакового типа ссылались на одно и тоже место в памяти. Что бы при изменении одного объекта, произошло тоже самое со вторым ибо они ссылаются на одну ячейку памяти.
artemoning вне форума Ответить с цитированием
Старый 08.12.2012, 02:51   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

static переменная?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 08.12.2012, 10:17   #3
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Ну это как раз по большей части и происходит.
Код:
object src = new object();
object b = src;
object c = src;
При изменении src все изменения будут доступны из b и c тоже.
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Старый 08.12.2012, 11:38   #4
artemoning
Пользователь
 
Регистрация: 20.09.2012
Сообщений: 23
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
static переменная?
Да, забыл написать что static переменная!
artemoning вне форума Ответить с цитированием
Старый 09.12.2012, 04:50   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

я не понимаю что вы хотите.

толе поле у вас должно быть общее, толи еще что...
а может и синглетон нужен...
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 09.12.2012, 11:04   #6
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
Сообщение

Цитата:
Сообщение от artemoning Посмотреть сообщение
Как сделать так что бы два объекта одинакового типа ссылались на одно и тоже место в памяти. Что бы при изменении одного объекта, произошло тоже самое со вторым ибо они ссылаются на одну ячейку памяти.
Если правильно понимаю то, что ты хочешь от переменной, то Пепел Феникса тебе все верно сказал, я лишь немного прокоментирую.
Допустим, что мы реализовали два самых простых класса:
Код:
public class MyClass1
{
public Int32 myValue=0;
}

public class MyClass2
{
public static Int32 myStaticValue=0;
}
Теперь начинаем использовать наши простые классы:
Код:
MyClass1 myClass1Ex1=new MyClass1();
MyClass1 myClass1Ex2=new MyClass1();
MyClass2 myClass2Ex1=new MyClass2();
MyClass2 myClass2Ex2=new MyClass2();
//изменяем значение переменных наших классов
myClass1Ex1.myValue+=1;
myClass1Ex2.myValue+=2;
myClass2Ex1.myStaticValue+=1;
myClass2Ex2.myStaticValue+=2;
//выводим наши значения
Console.WriteLine("{0}\n{1}\n{2}\n{3}",myClass1Ex1.myValue,myClass1Ex2.myValue,myClass2Ex1.myStaticValue,myClass2Ex2.myStaticValue)
Как ты думаешь, какие значения будут выведены этим кодом? Если ты скажешь, что мы получим строку: "1\n2\n1\n2", то ты ошибаешься! По завершении данных строчек кода, мы получим: "1\n2\n1\n3", т.к. поле myStaticValue является статическим, т.е. оно имеет отдельную "привязку" и реализацию для каждой переменной класса MyClass2, а общую, статическую для всего класса MyClass2. То, что помечено модификатором static представляется в одном "адресе памяти" и при его изменении в одной переменной данного класса, он меняется и внутри всех остальных переменных. Надеюсь, что понятно выразился?
Сам только что немного ругался по аналогичному поводу, созданному в C#. Вот немного адаптированный мой код:
Код:
class MyClass
{
protected Int32 i=0;

public MyClass(Int32 I)
{
this.i=I;
}

protected void Method1()
{
Console.WriteLine("It's my Method1");
}

protected void Method2()
{
Console.WriteLine("It's my Method2");
}

public void MainMethod()
{
switch(this.i)
{
case 1:
{
this.Method1();
break;
}
case 2:
{
this.Method2();
break;
}
default:
throw new ArgumentException("Дык, у Вас нет антивируса");
}
}
}
//реализация MyClass2
public class MyClass2
{
protected List<MyClass1> myClass1_list=new List<MyClass1>();
protected List<Thread> myThread_list=new List<Thread>();

public MyClass1(Int32[] IArray)
{
for(Int32 i=0;i!=IArray.Length;i++)
{
this.myClass1_list.Add(new MyClass1(IArray[i]));
//лично я в следующей строчке кода случайно сделал замыкание, которое мне совсем не нужно
this.myThread_list.Add(new Thread(delegate(){this.myClass1_list[i];}));
}
}

public void StartAllThread()
{
foreach(Thread currentThread in this.myThread_list)
{
currentThread.Start();
}
}
}
Теперь инициализирую переменную класса MyClass2:
Код:
Int32[] iArr=new Int32[3];
iArr[0]=1;
iArr[1]=2;
iArr[2]=1;
MyClass2 myClass2=new MyClass2(iArr);
myClass2.StartAllThread();
Console.ReadKey();
Как ты думаешь, что я получу в результате выполнения этого кода? А получу я Exception, а не нормально выполняющийся код. Спрашивается почему? - А потому что я случайно сделал замыкание на переменной i в конструкторе класса MyClass2, которая по завершении цикла будет равна 3. Вот это называется "замыканием" о котором можно более подробно прочитать тут на Хабре. Со статическими переменными все точно также - забыл, что ты создал две переменные одного и того же класса, в котором есть статическая переменная, первый экземпляр класса все вычислил правильно, занес данные в эту переменную, второй сделал тоже самое, но затер первоначальное значение и в итоге у тебя в статической переменной совсем не то что ты ожидал, поэтому лично я стараюсь обходить их использование.
ИМХО, у меня есть хорошая привычка - никогда не разрешать прямой доступ к полям класса, вместо этого доступа я организую доступ через свойства, тем самым я могу проинформировать все необходимые классы о том, что значение поля поменялось и они должны выполнить некоторые операции. Ты точно также можешь организовать доступ к полю как к свойству, внутри которого повесить событие: "Сигнализировать, что поле изменилось", например так:
Код:
class MyClass
{
protected Int32 anythingValue=0;

public AnythingValue
{
get
{
return this.anythingValue;
}
set
{
this.anythingValue=value;
this.MakeSignal();
}
}

protected void MakeSignal()
{
//подать сигнал, что поле изменилось
}
}
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.
Mixim вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ссылки Rodeman Паскаль, Turbo Pascal, PascalABC.NET 0 09.06.2012 21:33
ссылки Nastya_cutie PHP 4 08.05.2012 11:45
Получить имя файла из ссылки(в конце ссылки нет имени файла) Человек_Борща Работа с сетью в Delphi 11 05.06.2011 15:15
Ссылки Gen_r_questions PHP 3 30.03.2011 08:30