Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как с# работает с памятью? 
V
    Опции темы
CompWorm
  Дата 20.4.2013, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Допеределыватель
***


Профиль
Группа: Участник Клуба
Сообщений: 1689
Регистрация: 6.12.2004
Где: /

Репутация: нет
Всего: 31



Привет всем!

сразу скажу, я больше знаком с С++, чем с С#, потому такой вопрос задаю, возможно странный  smile 

в общем хочу реализовать на шарпе паттерн "адаптер" - это класс с указателями, в конструктор которого передаётся некий объект, далее этот объект потрошится, и его части привязываются к указателям адаптера.
Далее к этому объекту я буду обращаться через адаптер.

проблема в том, что, как я понял, в Шарпе указатели почти не используются, они находятся в ветке unsafe и вмечто них компилятор как-то сам разруливает что считать указателем, а что объектом... типа все переменные считаются ссылками(?)

может кто-нибудь показать на этом примере, как управляться с памятью?


--------------------
PM MAIL   Вверх
SKrivosein
Дата 21.4.2013, 04:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Идущий в даль
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 9.6.2007
Где: Praha - Прага

Репутация: 4
Всего: 8



CompWorm в .NET работа на прямую с памятью (и указатели) используются редко, только в специальных случаях. И паттерна "адаптер" не касаются.
Этот патерн можно сделать с помощью наследования, интерфейсов или делегатов. В том случае который ты описал (при недостатке инфы  smile ) скорее всего надо копать в сторону делегатов. Это такой "умный", безопасный указатель. Их там несколько подвидов, и несколько способов использования, надо подбирать по задаче.

Я попробовал накидать такой псевдокод с делегатами. Мож чего не так, так уточняй задачу...
Код

using System;

namespace AdapterConsoleApp
{
    //адаптируемый класс
    class Adaptee  
    {
        public double ReturnDouble(double a)  //метод принимающий double и возвращающий double
        {
            return a/3;
        }

        public string ReturnString()  // метод возвращающий string
        {
            return "anything !";
        }
    }

    // класс адаптера
    class Adapter  
    {
        public Func<double, int> RequestDoubleToInt;  //адаптированый делегат-метод принимающий double и возвращающий int
        public Func<string> RequestString;   //адаптированый делегат-метод возвращающий модифицированый string

        public Adapter(Adaptee adaptee)
        {
            RequestDoubleToInt = delegate(double i)  //анонимный метод для одноразового использования делегата RequestDoubleToInt
            {
                return (int)Math.Round(adaptee.ReturnDouble(i));
            };

            RequestString = delegate()
            {
                return "New " + adaptee.ReturnString();
            };
        }
    }

    class Client
    {
        static void Main(string[] args)
        {
            Adaptee adaptee = new Adaptee();
            double testDouble = 15.0712;

            Adapter adapter = new Adapter(adaptee);

            Console.WriteLine(adapter.RequestDoubleToInt(testDouble));
            Console.WriteLine(adapter.RequestString());

            Console.ReadLine();
        }
    }
}




--------------------
Оптимист - это плохо информированный человек.
user posted image

PM MAIL   Вверх
CompWorm
  Дата 25.4.2013, 03:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Допеределыватель
***


Профиль
Группа: Участник Клуба
Сообщений: 1689
Регистрация: 6.12.2004
Где: /

Репутация: нет
Всего: 31



короче, я похоже разобрался в общих чертах.
в шарпе классы дают ссылочный тип, а структуры нессылочный.

то есть
Код

    public class myClass {public int ddd;}
    public struct myStruct {public int ddd;}

    public partial class MainForm : Form
    {
        myClass aaa;
        myStruct bbb;

тут aaa - это то что в с++ зовётся смарт-поинтер. он пока нулевой и к члену ddd обратиться нельзя. его надо будет чем-то проинициализировать.

bbb это уже готовый объект, сразу можно позвать bbb.ddd.

соответственно при вызове такой функции
Код

void foo(myClass _aaa, myStruct _bbb){}
...
foo (aaa, bbb);

в _aaa будет скопирован адрес, на который ссылается aaa, а в _bbb будет скопирована bbb целеком. а чтобы bbb не копировалась, а передалась по ссылке надо использовать ref или out.

когда все ссылки на объект ссылочного типа померли, гарбидж-коллектор уничтожит эти объекты (в с++ это я бы назвал утечкой памяти smile такая ситуация мне странновата). 
по моим экспериментам, если вручную не вызвано 
GC.Clear();
то очистка произойдёт не раньше чем, через минуту.


--------------------
PM MAIL   Вверх
SKrivosein
Дата 26.4.2013, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Идущий в даль
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 9.6.2007
Где: Praha - Прага

Репутация: 4
Всего: 8



Цитата(CompWorm @ 25.4.2013,  03:42)
когда все ссылки на объект ссылочного типа померли, гарбидж-коллектор уничтожит эти объекты (в с++ это я бы назвал утечкой памяти smile такая ситуация мне странновата). 
по моим экспериментам, если вручную не вызвано 
GC.Clear();
то очистка произойдёт не раньше чем, через минуту.

Это с непривычки  smile  А если серьезно, то лучше на эту тему почитать Д. Рихтера CLR via C# Глава 21
Цитата

Обычно следует избегать вызова любых методов Соllect: лучше не вмешиваться
в работу сборщика мусора и позволить ему самостоятельно настраивать пороговые
значения для поколений, основываясь на реальном поведении приложения.

Но есть там всякие особенности, финализация, освобождение неуправляемых ресурсов, использование инструкции using. Хотя в общем-целом бояться за управляемую память, которая под контролем CLR, не надо. Она за собой заметет. 


--------------------
Оптимист - это плохо информированный человек.
user posted image

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0896 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.