161 / 101 / 22
Регистрация: 11.05.2009
Сообщений: 628
1

Set в свойстве класса

26.07.2011, 11:55. Показов 1557. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!

Есть свойство класса:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    private Map mapObject
    {
        get
        {
            try
            {
                Map myMap = MapInfo.Engine.Session.Current.MapFactory[MapControl1.MapAlias];
 
                if (myMap == null)
                    myMap = MapInfo.Engine.Session.Current.MapFactory[0];
 
                myMap.Load(loadCamLayers());
 
                return myMap;
            }
            catch
            {
                return MapInfo.Engine.Session.Current.MapFactory.CreateEmptyMap(new Size(1000, 1000));
            }
        }
    }
При получении значения проблем не возникает. Тип данных свойства - Map (класс).
Как сделать, что бы можно было в коде использовать конструкцию вида:

C#
1
        mapObject.Zoom = new MapInfo.Geometry.Distance(map.Zoom.Value / 2, map.Zoom.Unit);
Такая конструкция вызывает исключение: отсутствует ссылка на объект.
Пока приходится делать так:

C#
1
2
        Map map = mapObject;
        map.Zoom = new MapInfo.Geometry.Distance(map.Zoom.Value / 2, map.Zoom.Unit);
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.07.2011, 11:55
Ответы с готовыми решениями:

Не работает set в пользовательском свойстве UserControl
Здравствуйте. Сделал свой контрол. Создал ему свойство: public List<int> Values ...

В свойстве описываются только блоки get set, но не реализовываются. Исправить код
Ребят, всем привет!!!! Помогите пожалуйста исправить программу, чтобы она работала, вот программный...

Использование имя object в свойстве класса
День добрый. Столкнулся с проблемой: пишу вк бота, он скидывает json на мой сервер. Сам запрос...

Выбор поля класса в свойстве UserControl
Подскажите, как в режиме разработки(design-time) указать свойство моего пользовательского элемента...

18
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
26.07.2011, 12:07 2
ничего не понятно. а что вот эта штука должна бы, по-твоему, делать?

mapObject.Zoom = new MapInfo.Geometry.Distance(map.Zoom.Value / 2, map.Zoom.Unit);
разжуй поподробнее, что такое mapObject, и что такое map.
0
161 / 101 / 22
Регистрация: 11.05.2009
Сообщений: 628
26.07.2011, 12:10  [ТС] 3
Смотри, сейчас что бы присвоить что либо свойству zoom, мне нужно писать такую конструкцию:

C#
1
2
Map map = mapObject;//т. е. сначала получаю ссылку на объект
        map.Zoom = new MapInfo.Geometry.Distance(map.Zoom.Value / 2, map.Zoom.Unit);//а потом уже с ним работаю
А мне хотелось бы сделать, что бы получение ссылки на объект было автоматический. Я хочу что бы работала такая конструкция:

C#
1
mapObject.Zoom = new MapInfo.Geometry.Distance(map.Zoom.Value / 2, map.Zoom.Unit);
Т. е. что бы он сам при присвоении данных получал ссылку и с ней работал.
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
26.07.2011, 13:31 4
а что такое map в твоем коде? ссылка на "ничто"? и ты хочешь из этого "ничто" что-то использовать? или где?
0
161 / 101 / 22
Регистрация: 11.05.2009
Сообщений: 628
26.07.2011, 14:01  [ТС] 5
Но я же получаю ссылку:
C#
1
Map map = mapObject;
0
208 / 138 / 15
Регистрация: 28.04.2011
Сообщений: 389
26.07.2011, 14:26 6
ничо не понятно скинь весь класс и то место где выдает ошибку
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
26.07.2011, 15:34 7
Цитата Сообщение от VtaMC Посмотреть сообщение
Но я же получаю ссылку:
C#
1
Map map = mapObject;
но я так понимаю, что тебе это не нравится. что такое по-твоему "автоматически" я тоже не догоняю. может, то, что ты пишешь в двух операторах равносильно такой записи:


C#
1
mapObject.Zoom = new MapInfo.Geometry.Distance(mapObject.Zoom.Value / 2, mapObject.Zoom.Unit);
но это предполагает, что какой-тo Zoom у этого объекта уже сущетсвует (не знаю, правда, что это такое). и более того: Value и Unit тоже должны существовать, и иметь допустимые значения.
но опять же: я не понимаю, что такое из себя твой объект представляет, и что из себя представляют его свойства.
0
161 / 101 / 22
Регистрация: 11.05.2009
Сообщений: 628
26.07.2011, 16:02  [ТС] 8
novi4ok, Map - это объект из пространства MapInfo (MapXtreme).
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
26.07.2011, 16:35 9
Цитата Сообщение от VtaMC Посмотреть сообщение
novi4ok, Map - это объект из пространства MapInfo (MapXtreme).
в эти пространства никогда не углублялся, потому не знаю, что такое Zoom, например.
удивляет, что ты утверждаешь, что mapObject - совойство, в то же время оно private.

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

А мне хотелось бы сделать, что бы получение ссылки на объект было автоматический. Я хочу что бы работала такая конструкция:

C#
1
mapObject.Zoom = new MapInfo.Geometry.Distance(map.Zoom.Value / 2, map.Zoom.Unit);
у тебя map? это еще один Map-объект, или тот же самый, Zoom-у которого ты что-то присваиваешь?
0
161 / 101 / 22
Регистрация: 11.05.2009
Сообщений: 628
26.07.2011, 16:39  [ТС] 10
Я хочу сделать так, что бы при обращении к свойству zoom мне не надо было создавать ещё один объект:

Например как здесь:
C#
1
2
Map map = mapObject;
        map.Zoom = new MapInfo.Geometry.Distance(map.Zoom.Value / 2, map.Zoom.Unit);
А я хочу, что бы ссылку не надо было создавать и можно было бы сразу задать свойство объекта:
C#
1
mapObject.Zoom = new MapInfo.Geometry.Distance(map.Zoom.Value / 2, map.Zoom.Unit);
0
176 / 168 / 27
Регистрация: 12.01.2009
Сообщений: 430
26.07.2011, 17:17 11
Map структура или класс?
0
Эксперт .NET
4432 / 2092 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
26.07.2011, 17:26 12
Покажи пример кода, где ты это используешь. Можешь удалить все лишние методы, которые никак не относятся к вопросу, просто не понятно в каком контексте, что ты используешь и что ты хочешь тоже вообще не понятно. Вот несколько раз перечитывал, пытался осилить, но в итоге только догадки.

Не по теме:


Раньше часто выпытывал, также как сейчас что и как и т.д. Была тут одна тема, так там я и не выпытал. Теперь первое что приходит на ум: "Ну раз тебе лень выложить код по сути вопроса, то не буду тратить своё время". Другими словами: "Если ты сам не хочешь себе помочь, то тебе уже никто не поможет".



Вообще ещё что скажу автору темы, это ты представляешь, что и как у тебя в проге и понимаешь, что ты хочешь сделать и у тебя не получается. Когда (и если) будешь сюда писать ответ и выкладывать более подробный код, то посмотри на код так, как будто ты вообще его впервые видишь, надеюсь поймёшь каких деталей там не достаёт, а если нет то я уже писал серым текстом в "Не по теме" (последнее предложение).

Добавлено через 2 минуты
Цитата Сообщение от Humanitis Посмотреть сообщение
Map структура или класс?
Цитата Сообщение от VtaMC Посмотреть сообщение
Тип данных свойства - Map (класс).
Он уже писал.
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
26.07.2011, 17:45 13
Цитата Сообщение от VtaMC Посмотреть сообщение
Я хочу сделать так, что бы при обращении к свойству zoom мне не надо было создавать ещё один объект:

Например как здесь:
C#
1
2
Map map = mapObject;
        map.Zoom = new MapInfo.Geometry.Distance(map.Zoom.Value / 2, map.Zoom.Unit);
А я хочу, что бы ссылку не надо было создавать и можно было бы сразу задать свойство объекта:
C#
1
mapObject.Zoom = new MapInfo.Geometry.Distance(map.Zoom.Value / 2, map.Zoom.Unit);
кажется доперло! ты просто не отличаешь object от object reference.
объект - это как телевизор. а ссылка - это как пульт управления телевизором. ты не создаешь еще один объект. ты создаешь еще одну ссылку на тот же объект (еще один пульт управления тем же одним теликом). понятно? если то, что ты написал, в первом отрывке, делает то, что тебе надо, то пиши просто как я тебе уже приводил:
C#
1
mapObject.Zoom = new MapInfo.Geometry.Distance(mapObject.Zoom.Value / 2, mapObject.Zoom.Unit);
по сути вот это:
C#
1
2
Map map = mapObject;
        map.Zoom = new MapInfo.Geometry.Distance(map.Zoom.Value / 2, map.Zoom.Unit);
делает ТО ЖЕ САМОЕ! т.е этим пультом управления ты переключаешь программы не на другом телевизоре, а на том же самом. ты не создаешь еще один телевизор. ясно?
0
161 / 101 / 22
Регистрация: 11.05.2009
Сообщений: 628
26.07.2011, 18:00  [ТС] 14
Вот весь класс в котором это происходит:

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
using System;
using System.Configuration;
using System.Collections.Generic;
using System.Drawing;
using MapInfo.Mapping;
using MapInfo.WebControls;
using MapInfo.Data.Find;
using MapInfo.Data;
using MapInfo.Geometry;
 
public partial class _Default : System.Web.UI.Page
{
    private Map map;
 
    private Map mapObject
    {
        get
        {
            try
            {
                Map myMap = MapInfo.Engine.Session.Current.MapFactory[MapControl1.MapAlias];
 
                if (myMap == null)
                    myMap = MapInfo.Engine.Session.Current.MapFactory[0];
 
                myMap.Load(loadCamLayers());
 
                return myMap;
            }
            catch
            {
                //в случае ошибки возвращаем заглушку
                return MapInfo.Engine.Session.Current.MapFactory.CreateEmptyMap(new Size(1000, 1000));
            }
        }
    }
 
    protected void zoomIn_Click(object sender, EventArgs e)
    {
        map = mapObject;
        map.Zoom = new MapInfo.Geometry.Distance(map.Zoom.Value / 2, map.Zoom.Unit);
    }
 
    protected void zoomOut_Click(object sender, EventArgs e)
    {
        map = mapObject;
        map.Zoom = new MapInfo.Geometry.Distance(map.Zoom.Value * 2, map.Zoom.Unit);
    }
}
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
26.07.2011, 18:41 15
зачем тебе вообще private Map map; понадобился? он ведь фактически ничго не делает, только запутывает самого тебя. он, конечно, производительности тебе повышает, но ты сам себе это устроил, введя "private property". концепция свойств у класса не для того придумана. ты используешь эту концепцию не по прямому назначению.
0
Эксперт .NET
4432 / 2092 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
26.07.2011, 20:42 16
У тебя вылетает исключение, потому-что ты обращаешься к map:
C#
1
mapObject.Zoom = new MapInfo.Geometry.Distance(map.Zoom.Value / 2, map.Zoom.Unit);
когда она ещё null, короче тут самое правильное решение думаю такое:

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
    public partial class _Default : System.Web.UI.Page
    {
        private Map GetNewMap()
        {
            try
            {
                Map myMap = MapInfo.Engine.Session.Current.MapFactory[MapControl1.MapAlias];
 
                if (myMap == null)
                    myMap = MapInfo.Engine.Session.Current.MapFactory[0];
 
                myMap.Load(loadCamLayers());
 
                return myMap;
            }
            catch
            {
                //в случае ошибки возвращаем заглушку
                return MapInfo.Engine.Session.Current.MapFactory.CreateEmptyMap(new Size(1000, 1000));
            }
        }
 
        protected void zoomIn_Click(object sender, EventArgs e)
        {
            Map map = GetNewMap();
            map.Zoom = new MapInfo.Geometry.Distance(map.Zoom.Value / 2, map.Zoom.Unit);
        }
 
        protected void zoomOut_Click(object sender, EventArgs e)
        {
            Map map = GetNewMap();
            map.Zoom = new MapInfo.Geometry.Distance(map.Zoom.Value * 2, map.Zoom.Unit);
        }
    }
А вообще кто его знает как у тебя оно там всё работает, может можно и умнее сделать.
0
161 / 101 / 22
Регистрация: 11.05.2009
Сообщений: 628
26.07.2011, 22:15  [ТС] 17
Casper-SC, дак так у меня сейчас сделано.
0
Эксперт .NET
4432 / 2092 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
26.07.2011, 23:05 18
Цитата Сообщение от VtaMC Посмотреть сообщение
Casper-SC, дак так у меня сейчас сделано.
Посмотри отличия, у тебя не совсем так сделано. Я сделал по нормальному, а у тебя зачем-то получение Map в поле класса потом уже работа с этим полем, и всё это через приватное свойство (плюс ко всему свойство с маленькой буквы начинается).

Ну если тебе нужно подругому, раскомментируй подробно, что делается в свойстве. И почему каждый раз надо создавать новый объект? Да и вообще зачем придумывать этот гемор с свойством? И так нормально всё должно работать.

Если бы у тебя свойство получало объект только в определённых ситуациях, а так в основном давало доступ к полю, то можно было бы так (это просто пример):
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
public partial class _Default : System.Web.UI.Page
{
    private Map map;
 
    private Map MapObject //свойство с большой буквы должно начинаться (желательно)
    {
        get
        {
            try
            {
                if (map == null)
                    map = MapInfo.Engine.Session.Current.MapFactory[0];
 
                return map;
            }
            catch
            {
                //Ну или как там в Web переходить =)
                Process.Start("http://www.nooooooooooooooo.com/"); 
            }
        }
    }
 
    protected void zoomIn_Click(object sender, EventArgs e)
    {
        MapObject.Zoom = new MapInfo.Geometry.Distance(MapObject.Zoom.Value / 2, MapObject.Zoom.Unit);
    }
 
    protected void zoomOut_Click(object sender, EventArgs e)
    {
        MapObject.Zoom = new MapInfo.Geometry.Distance(MapObject.Zoom.Value * 2, MapObject.Zoom.Unit);
    }
}
Если сейчас так обращаться к свойству (ну если весь код оставить как есть сейчас у тебя), то получится, что в zoomOut_Click будет 3 раза создаваться новый объект. Короче тут надо больше знать и видеть дальше чем чисто этот класс, тогда можно было бы что-то придумать. А вообще использовал бы мой способ (он реально отличается от твоего).
1
161 / 101 / 22
Регистрация: 11.05.2009
Сообщений: 628
27.07.2011, 10:04  [ТС] 19
Спасибо, сделаю так как ты сказал.
0
27.07.2011, 10:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.07.2011, 10:04
Помогаю со студенческими работами здесь

Проверка корректности ввода данных в свойстве экземпляра класса
Привет. Подскажите плз. Если нужно при вводе значения в свойство класса проверить его...

Два класса и данные через get/set
Есть два класса Config и Brick При попытке передать данные из Config в Brick, они не передаются....

Объект базового класса вернуть как get set
Дан базовый класс А, от него унаследован производный класс B, и в нем определен объект класса А,...

Методы get и set для объектов базового класса
class B:A { B():base(){} public A a; public A aA //нужно определить...

Доступ через get/set к элементам массива внутри класса
Вот такой простой код, а как с помощью get/set обращаться к каждому элементу массива _b в...

Почему иногда свойствами называют и переменные класса, а так же set и get
Почему иногда свойствами называют и переменные класса, и так же функции set, get? Допустим...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru