| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > .NET для новичков > константные функции в C# |
| Автор: Alek86 3.10.2007, 16:03 |
| есть ли возможность в C# объявить аналог константной функции C++? чтобы, вызывая ее, я был уверен, что она не поменяет переменные-члены своего класса |
| Автор: mr.DUDA 3.10.2007, 16:06 |
| ИМХО, нет такого. |
| Автор: iad 4.10.2007, 08:48 | ||
Только так:
еще можно использовать модификаторы доступа internal, но это уже будет нарушением инкапсуляции |
| Автор: tol05 4.10.2007, 10:35 | ||
| iad, это отдаленно напоминает реализацию свойств... Alek86, ИМХО имеет в виду обычные плюсовые константные ф-ции. Если сделать свойства только на чтение и работать только через них (а это правильно, в принципе), то значения членов класса изменить будет нельзя. Опять же, Alek86, смотря что понимать под изменением члена класса (и какой тип члена класса). Если
то m_i не изменится. Но если член класса - ссылочный, то он изменится. Методы класса имеют неограниченный доступ к членам своего класса. Повторяю - не работай с полями класса напрямую нигде, кроме как в конструкторах, инициализаторах и свойствах. |
| Автор: Alek86 4.10.2007, 12:01 |
| спасибо за ответы, но самый хороший ответ прозвучал у mr.DUDA потому что во всех остальных примерах я, если использую чужой класс, не могу быть уверен, что он после выполнения определенной функции не изменится. слово const в сях давало хоть какую-то гарантию... и, не подскажет ли кто, почему эту возможность в шарпе убрали? |
| Автор: iad 4.10.2007, 15:27 | ||||
я тоже их имею ввиду
|
| Автор: tol05 4.10.2007, 15:34 |
| iad В том контексте, в котором я говорил (и с тем примером, что я привел) - я не сказал направды Описывать все варианты, все типы данных (а потом и отличия между ними и т.д. и т.п. ) .... Мне что, переписать себе в пост несколько толстых учебников??? Короче... даже отвечать тебе - "не сто'ит" .... :((( |
| Автор: iad 4.10.2007, 17:52 |
| ты сказал правду, ты подписался в некомпетентности и поэтому ты абсолютно прав: "отвечать мне не стоит" |
| Автор: ivashkanet 4.10.2007, 18:39 |
| iad, пожалуйста без наездов! Тут идёт обсуждение! А не мерянье пип. Тем более, что tol05, ИМХО, прав: хочешь запретить изменение элементов класса --- убери все сеттеры. Твой пример ни на что не годиться, так как программер, кот запретит изменение члена класса позаботиться, чтобы и этот член не имел интерфейса для прямого своего изменения. А создавать такие классы как у тебя, а потом говорить, что я запретил изменять их элементы как минимум смешно. |
| Автор: iad 4.10.2007, 18:55 | ||
|
| Автор: ivashkanet 4.10.2007, 19:00 | ||||
| iad, у тя пример, всего лишь пример (хотя я такого бы не писал)... Я же описал общий подход. Кста, для САБЖА может применяться паттерн декоратор. Посмотреть на его реализацию можно в самом фрэймворке. Класс ArrayList и статический метод ReadOnly:
Вот сам Класс декоратор:
|
| Автор: iad 4.10.2007, 19:08 |
| Декоратор тоже вариант. ок. Но проверка изменения объекта будет в рантайме. си++ый вариант позволяет отследить попытки изменения на этапе компиляции.. считаю это большим плюсом и с удовольствием бы пользовался такой возможностью |
| Автор: tol05 5.10.2007, 10:23 | ||
два момента: 1. Где я был некомпетентен? В какой строчке какого поста? Я не начал объяснять что есть ссылочные типы, есть типы значений и т.д. и т.п.? Не просили 2. Какова вообще была твоя цель, когда ты свой первый пост писал? Автору помочь или себя показать? Автору ты не помог и даже не пытался. Ну а себя... да, показал. -1 |
| Автор: ivashkanet 5.10.2007, 10:35 | ||||||
Кто нить мне может объяснить нафик этот const нужен? Я понимаю еще такую конструкцию:
Но какой толк от конструкции:
Ведь ты САМ пишешь эту функцию и ты САМ знаешь что можно менять, а что нет. Зачем ещё просить компилятор: "Вот это вот менять ни в коем случае нельзя! Так что напомни, мне глупому, если я захочу это поменять..." |
| Автор: iad 5.10.2007, 11:20 | ||||||
|
| Автор: ivashkanet 5.10.2007, 11:33 | ||||
Подробнее, плиз. Т.е. я должен помечать все функции, кот не меняют значения переменных таким образом? И что-то я не нашел такого здесь: http://en.wikipedia.org/wiki/Const_correctness P.S. int это был пример. не надо быть таким категоричным Добавлено через 1 минуту и 14 секунд
А если не пометил, то что? Ее нельзя использовать? Требую пояснений. (Прошу отнестись с пониманием. Я в плюсах не силен. И с такой фичей не сталкивался). |
| Автор: iad 5.10.2007, 17:12 | ||||||
Добавлено через 9 минут и 3 секунды в догонку тогда появится смысл в конструкции
|
| Автор: mr.DUDA 5.10.2007, 17:32 |
| Кстати, если уж лезть в дебри, то гарантировать сохранность объектов в многопоточном приложении никто не может -- я вот не буду ничего менять, а другой поток возьмёт и изменит. |
| Автор: ivashkanet 5.10.2007, 17:55 | ||
Зато Вася Ламеров может спокойно удалить этот const (зачем он нужен, если компилятор на него раугается, а без него все ОК ;-)), компилятор все съест и поехало... Нормально. Т.е. как я и думал. |
| Автор: iad 5.10.2007, 18:03 | ||
ну если в моем классе, мною созданный поток - я разработчик, то да.. я и дурак. А если другой товырисч извне - то фиг ему.. не выйдет. Разумеется все касаемо данной темы.
|
| Автор: mr.DUDA 5.10.2007, 18:09 | ||
|