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

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> константные функции в C# 
:(
    Опции темы
iad
Дата 5.10.2007, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 10.9.2007
Где: Москов

Репутация: 0
Всего: -2



Цитата(ivashkanet @  5.10.2007,  11:35 Найти цитируемый пост)
Но какой толк от конструкции:код C#1:void doSomething(const int value) {/*...*/}
конечно нет толку, тем более для int. смысл есть в конструкции
Код

 public string ConstantFunction()const// - указание компилятору что эта функция не меняет состояние объекта
        {}
только она нереальна в C#. Смысл в том что я не хочу, при определенных условиях, давать возможность пользователям моего класса изменять содержимое объекта. 
Цитата(ivashkanet @  5.10.2007,  11:35 Найти цитируемый пост)
Ведь ты САМ пишешь эту функцию....Так что напомни, мне глупому, если я захочу это поменять...
Не тебе. А пользователю твоего класса, потому что не всегда проекты пишутся в одно лицо. 

PM MAIL   Вверх
ivashkanet
Дата 5.10.2007, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 3
Всего: 149



Цитата(iad @  5.10.2007,  11:20 Найти цитируемый пост)
 public string ConstantFunction()const// - указание компилятору что эта функция не меняет состояние объекта

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

И что-то я не нашел такого здесь: http://en.wikipedia.org/wiki/Const_correctness

P.S. 
Цитата(iad @  5.10.2007,  11:20 Найти цитируемый пост)
тем более для int

int это был пример. не надо быть таким категоричным

Добавлено через 1 минуту и 14 секунд
Цитата(ivashkanet @  5.10.2007,  11:33 Найти цитируемый пост)
Т.е. я должен помечать все функции, кот не меняют значения переменных таким образом?

А если не пометил, то что? Ее нельзя использовать? Требую пояснений.
(Прошу отнестись с пониманием. Я в плюсах не силен. И с такой фичей не сталкивался).
PM MAIL WWW ICQ   Вверх
iad
Дата 5.10.2007, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 10.9.2007
Где: Москов

Репутация: 0
Всего: -2



Цитата(ivashkanet @  5.10.2007,  12:33 Найти цитируемый пост)
Подробнее, плиз. Т.е. я должен помечать все функции, кот не меняют значения переменных таким образом?
ну да, типа того. Только не должен помечать, а можешь - если хочешь. это синтаксис C++, помеченная таким образом функция говорит компилятору что содержимое объекта не будет изменено. Допустим у тебя есть класс контейнер. В нем находится мембер типа Закголовок. Пусть это будет какая-нибудь коллекция, описывающая заголовок таблицы.  Причем эта коллекция - самодостаточный класс, который может использоваться для других целей, абсолютно самостоятельно. Поэтому мы не хотим его специально переписывать для класса контейнера. Есть еще в классе контейнере сама таблица в виде какого-нибудь двумерного массива. Логичиски этот массив и заголовок связаны друг с другом. Одна из размернстей таблицы и размерность заголовка должну быть одинаковы. Если по С#-пному я открою доступ (пусть даже через ридонли свойство) к заголовку, пользователь моего класса сможет сделать заголовку какой-нибудь Clear() или Resize() и размерности перестану совпадать, и пойдут рантайм ошибки. Конечно это будут ошибки проектировщика, надо было предусмотреть такую фигню, но.. Если мы предоставим доступ к заголовку как константную ссылку, то компилятор не даст дергать эту ссылку за методы Clear() или Resize(), мы же их не пометили как const... и другой разработчик, который использует твой контейнер, не сможет навредить ему при всем желании, даже не удосужившись прочитать описание. Экономия времени по любому, тк не надо изыскивать красивые архитектурные решения, для обеспечения 100%-й инкапсуляции или заморачиваться на документацию, при отказе от полной реализации этой самой инкапсуляции... Ну как мог рассказал smile

Добавлено через 9 минут и 3 секунды
в догонку
тогда появится смысл в конструкции 
Код

        void doSomething(const int value) {/*...*/}
 только опять же не int, а на основе вышесказанного что-то типа
Код

void doSomething(const container value_) {value_.Header.Clear();//error}


PM MAIL   Вверх
mr.DUDA
Дата 5.10.2007, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



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


--------------------
user posted image
PM MAIL WWW   Вверх
ivashkanet
Дата 5.10.2007, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 3
Всего: 149



Цитата(iad @  5.10.2007,  17:12 Найти цитируемый пост)
не надо изыскивать красивые архитектурные решения, для обеспечения 100%-й инкапсуляции или заморачиваться на документацию, при отказе от полной реализации этой самой инкапсуляции..

Зато Вася Ламеров может спокойно удалить этот const (зачем он нужен, если компилятор на него раугается, а без него все ОК ;-)), компилятор все съест и поехало...
Цитата(iad @  5.10.2007,  17:12 Найти цитируемый пост)
Ну как мог рассказал

Нормально. Т.е. как я и думал.
PM MAIL WWW ICQ   Вверх
iad
Дата 5.10.2007, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 10.9.2007
Где: Москов

Репутация: 0
Всего: -2



Цитата(mr.DUDA @  5.10.2007,  18:32 Найти цитируемый пост)
 а другой поток возьмёт и изменит.
 ну если в моем классе, мною созданный поток - я разработчик, то да.. я и дурак. А если другой товырисч извне - то фиг ему.. не выйдет. Разумеется все касаемо данной темы.
Цитата(ivashkanet @  5.10.2007,  18:55 Найти цитируемый пост)
Зато Вася Ламеров может спокойно удалить этот const (зачем он нужен, если компилятор на него раугается, а без него все ОК ;-))
 а може забаится менят smile

PM MAIL   Вверх
mr.DUDA
Дата 5.10.2007, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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




M
mr.DUDA
Тема раскрыта полностью. Засим, во избежание дальнейших спекуляций, прикрываю её.



--------------------
user posted image
PM MAIL WWW   Вверх
Закрытая темаСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

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


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

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


 




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


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

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