В который раз декларирую функцию и по привычке из C++ тянет const написать для параметра.
И каждый раз эта ментальная ломка.
Не помойму я. Не ужели построение NET не позволяет добавить это в копилятор?
Как мне кажется это ни как не затрагивает внутренности .NET, а лишь касается компилятора.
Да и можно зделать это чуть красивше чем в C++ — чтоб обойти было не возможно всякими кросскастами.
Или у создателей личная неприязнь к const?
28.11.05 08:04: Перенесено модератором из '.NET' — TK
C>В который раз декларирую функцию и по привычке из C++ тянет const написать для параметра. C>И каждый раз эта ментальная ломка.
Управляемая среда после неуправляемой — это в любом случае ментальная ломка.
C>Не помойму я. Не ужели построение NET не позволяет добавить это в копилятор? C>Как мне кажется это ни как не затрагивает внутренности .NET, а лишь касается компилятора. C>Да и можно зделать это чуть красивше чем в C++ — чтоб обойти было не возможно всякими кросскастами. C>Или у создателей личная неприязнь к const?
Уже был хороший ответ с подборкой ссылок, но если коротко — то этот параметр лишний.
NC>Уже был хороший ответ с подборкой ссылок, но если коротко — то этот параметр лишний.
Читал я все это.
Как это лишний!?
Тогда как запретить модификацию дочернего объекта возвращаемого через проперти?
Только не надо насчет создания readonly интерфейсов.
это во первых не всегда возможно,во вторых очень убого и каряво если начать на каждый обект огород городить.
Наверное. Если взять доступные С++ исходники от МS (MFC, ATL, MSDN samples) — const для парметров (кроме copy constructors and assignment operators) и функций-членов практ. не используется. Может у них запрещено? Да и вообще, только в ATL можно действительно "настоящий" С++ местами увидеть, остальное, IMHO, больше похоже на "первые шаги С программиста в С++".
Здравствуйте, chudo19, Вы писали:
C>Здравствуйте, Nickolay Ch, Вы писали:
NC>>Уже был хороший ответ с подборкой ссылок, но если коротко — то этот параметр лишний. C>Читал я все это. C>Как это лишний!?
C>Тогда как запретить модификацию дочернего объекта возвращаемого через проперти? C>Только не надо насчет создания readonly интерфейсов. C>это во первых не всегда возможно,во вторых очень убого и каряво если начать на каждый обект огород городить.
Ну как, как запретить... СОздать проперти, у которой метод set не реализовывать.
Здравствуйте, Codechanger, Вы писали:
C>Ну как, как запретить... СОздать проперти, у которой метод set не реализовывать.
А так?
using System;
using System.Collections;
class Program
{
[STAThread]
static void Main(string[] args)
{
Test t = new Test();
Console.WriteLine(t.Bar[0]);
t.Bar[0] = 7777777;
Console.WriteLine(t.Bar[0]);
}
}
class Test
{
private ArrayList bar;
public Test()
{
this.bar = new ArrayList();
for(int i = 0; i < 5; i++)
{
this.bar.Add(i);
}
}
public ArrayList Bar
{
get
{
return this.bar;
}
}
}
Здравствуйте, chudo19, Вы писали:
C>Предлагаю начать собирать подписи. Авось их проймет.
Собирать подписи легко. А теперь представь себе что у тебя есть несколько языков. Ну например тот-же паскаль. Интерфейс у тебя содержит константные параметры. Твоя задача написать реализацию данного интерфейса. Но это сделать нельзя, поскольку у языка нет такого понятия как константные параметры в принципе. И сэмулировать внутренними средствами нельзя. Результат понятен. Паскаль никогда не станет CRL совместимым языком. Поэтому к таким шнягам очень осторожно относятся.
Здравствуйте, GlebZ, Вы писали:
GZ>А теперь представь себе что у тебя есть несколько языков. Ну например тот-же паскаль. Интерфейс у тебя содержит константные параметры. Твоя задача написать реализацию данного интерфейса. Но это сделать нельзя, поскольку у языка нет такого понятия как константные параметры в принципе. И сэмулировать внутренними средствами нельзя.
Ну и что? Во времена шестого басика тоже нельзя было ко многим интерфейсам доступ получить… И компоненты разделялись на "доступные из бейсика и недоступные"
Даже в ВБ.НЕТ поначалу беззнаковых целых небыло…
GZ> Результат понятен. Паскаль никогда не станет CRL совместимым языком. Поэтому к таким шнягам очень осторожно относятся.
Тююю… Бейсик же стал? (по сравнению с тем, что до дотНета было)
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, Nickolay Ch, Вы писали:
NC>но если коротко — то этот параметр лишний.
а если правильно — то разработчики решили, что реализация будет слишком сложна и возможные преимущества не окупят затрат
так что нормальных констант в CLI нет, и судя по всему — не будет
другой вопрос — правы они были или нет. Проблемы с RPC, которые создаются из-за их отстуствия — это еще цветочки
Здравствуйте, _FRED_, Вы писали:
_FR>Ну и что? Во времена шестого басика тоже нельзя было ко многим интерфейсам доступ получить… И компоненты разделялись на "доступные из бейсика и недоступные"
_FR>Даже в ВБ.НЕТ поначалу беззнаковых целых небыло…
И непонятно зачем ввели CLS совместимый язык содержит только беззнаковые переменные
А теперь подумай, чем грозит ввод констант, чем грозит то, что модуль на другом языке изменит значение такого параметра.
_FR>Тююю… Бейсик же стал? (по сравнению с тем, что до дотНета было)
Ну VB.NET и VB6 — два разных языка с похожим синтаксисом. Есть возражения?
Здравствуйте, GlebZ, Вы писали:
_FR>>Ну и что? Во времена шестого басика тоже нельзя было ко многим интерфейсам доступ получить… И компоненты разделялись на "доступные из бейсика и недоступные"
_FR>>Даже в ВБ.НЕТ поначалу беззнаковых целых небыло… GZ>И непонятно зачем ввели CLS совместимый язык содержит только беззнаковые переменные GZ>А теперь подумай, чем грозит ввод констант, чем грозит то, что модуль на другом языке изменит значение такого параметра.
Какого "такого"? Константного или беззнакового? Допустим, константного. Тут два варианта. Или "другой язык" понимает константность, но тогда неинтересно, либо не понимает. Тогда он её не видит и не может до неё доступиться. Не знает о ней и всё. И ничего страшного в этом нету. Обидно, когда вот такой метод понадобится… Но выкрутиться всегда можно (неконстантной обёрткой например на том же шарпе). Через одно место способ? Да. Но он есть. А константности нет
Хотя, пообвыкнув, замечаю, что не так уж она и необходима Можно завести свой ConstantAttribute и проверять его из FxCop или тем же R#. На этапе компиляции, думается мне, не такая уж это архисложная задача для того, кто по настоящему тоскует Уж всяк быстрее, чем подписи собирать и ждать того, чего, скорее всего, не будет.
_FR>>Тююю… Бейсик же стал? (по сравнению с тем, что до дотНета было) GZ>Ну VB.NET и VB6 — два разных языка с похожим синтаксисом. Есть возражения?
Напротив, подтверждение! Кто мешает расширить синтаксис паскаля или создать на его основе новый язык
Здравствуйте, _FRED_, Вы писали:
_FR>Какого "такого"? Константного или беззнакового? Допустим, константного. Тут два варианта. Или "другой язык" понимает константность, но тогда неинтересно, либо не понимает. Тогда он её не видит и не может до неё доступиться. Не знает о ней и всё. И ничего страшного в этом нету. Обидно, когда вот такой метод понадобится… Но выкрутиться всегда можно (неконстантной обёрткой например на том же шарпе). Через одно место способ? Да. Но он есть. А константности нет
Ничего не понял.
Давай, немного опишу насколько сложно, нетривиально, и скорее всего не нужно.
Value объекты и muttable отметаем сразу. Они по определению константны.
Например у нас сеть метод.
void Brahmaputra(const Brahma putra)
{
putra.Meditiroval();
}
Итак, что мы здесь видим. Мы поставили const(также как в C++), который нам гарантирует что putra не изменит своего состояния.
Для того чтобы так было, у нас есть обязанность, чтобы язык который реализовал putra — должен поддерживать информацию о том, что метод putra.Meditiroval() — не изменяет внутреннего состояния объекта. Без такой информации, модель работать не может. Если Brahma написан на языке не поддерживающем константность, то как и не извращайся, то....... Вобщем лучше не извращаться.
_FR>Хотя, пообвыкнув, замечаю, что не так уж она и необходима Можно завести свой ConstantAttribute и проверять его из FxCop или тем же R#. На этапе компиляции, думается мне, не такая уж это архисложная задача для того, кто по настоящему тоскует Уж всяк быстрее, чем подписи собирать и ждать того, чего, скорее всего, не будет.
+1
_FR>>>Тююю… Бейсик же стал? (по сравнению с тем, что до дотНета было) GZ>>Ну VB.NET и VB6 — два разных языка с похожим синтаксисом. Есть возражения? _FR>Напротив, подтверждение! Кто мешает расширить синтаксис паскаля или создать на его основе новый язык
Не мало ли языков получается на душу населения. С паскалем будет еще просто. А как быть с SML.NET?
Здравствуйте, GlebZ, Вы писали:
_FR>>Какого "такого"? Константного или беззнакового? Допустим, константного. Тут два варианта. Или "другой язык" понимает константность, но тогда неинтересно, либо не понимает. Тогда он её не видит и не может до неё доступиться. Не знает о ней и всё. И ничего страшного в этом нету. Обидно, когда вот такой метод понадобится… Но выкрутиться всегда можно (неконстантной обёрткой например на том же шарпе). Через одно место способ? Да. Но он есть. А константности нет GZ>Ничего не понял. GZ>Давай, немного опишу насколько сложно, нетривиально, и скорее всего не нужно. GZ>Value объекты и muttable отметаем сразу. Они по определению константны. GZ>Например у нас сеть метод.
GZ>Итак, что мы здесь видим. Мы поставили const(также как в C++), который нам гарантирует что putra не изменит своего состояния. GZ>Для того чтобы так было, у нас есть обязанность, чтобы язык который реализовал putra — должен поддерживать информацию о том, что метод putra.Meditiroval() — не изменяет внутреннего состояния объекта. Без такой информации, модель работать не может. Если Brahma написан на языке не поддерживающем константность, то как и не извращайся, то....... Вобщем лучше не извращаться.
И что плохого
_FR>>>>Тююю… Бейсик же стал? (по сравнению с тем, что до дотНета было) GZ>>>Ну VB.NET и VB6 — два разных языка с похожим синтаксисом. Есть возражения? _FR>>Напротив, подтверждение! Кто мешает расширить синтаксис паскаля или создать на его основе новый язык GZ>Не мало ли языков получается на душу населения. С паскалем будет еще просто. А как быть с SML.NET?
Прогресс, блин То есть улучшение, то есть уточнение, то есть более подробная специфмкация (только чтоб без дырок).
Help will always be given at Hogwarts to those who ask for it.
GZ>>Итак, что мы здесь видим. Мы поставили const(также как в C++), который нам гарантирует что putra не изменит своего состояния. GZ>>Для того чтобы так было, у нас есть обязанность, чтобы язык который реализовал putra — должен поддерживать информацию о том, что метод putra.Meditiroval() — не изменяет внутреннего состояния объекта. Без такой информации, модель работать не может. Если Brahma написан на языке не поддерживающем константность, то как и не извращайся, то....... Вобщем лучше не извращаться.
_FR>И что плохого
В смысле, чем это отличается от того, что в Brahma есть одно единственное свойство Value типа uint??? Хуже — не будет, но верю, что потребует изменения «самых потрохов» и не настаиваю
Здравствуйте, _FRED_, Вы писали: GZ>>Для того чтобы так было, у нас есть обязанность, чтобы язык который реализовал putra — должен поддерживать информацию о том, что метод putra.Meditiroval() — не изменяет внутреннего состояния объекта. Без такой информации, модель работать не может. Если Brahma написан на языке не поддерживающем константность, то как и не извращайся, то....... Вобщем лучше не извращаться.
_FR>И что плохого
В смысле "что плохого"? Ты только что получил compiler error
OC8988: possible attempt to modify const object. Method Brahma.Meditiroval() misses the CompilerServices.ConstAttribute attribute
После этого ты вздыхаешь и убираешь const от параметра. Что тут же приводит к каскаду таких же ошибок там, где ты вызывал Brahmaputra().
Ты материшься и выполняешь контекстную замену "const" на "" по всему солюшну. После чего понимаешь, что const — штука хорошая, но нежизнеспособная.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
_FR>>И что плохого
[…]
Согласен со всем
S>…После чего понимаешь, что const — штука хорошая, но нежизнеспособная.
Жизнеспособная, например, в рамках группы языков, поддерживающих константность. Этого более чем достаточно. Если же язык константность не поддерживает, то да, с ним и должно быть всё нехорошо. Например [могу грубо ошибиться, поправьте кто знает лучше], спецификация COM вроде бы не поддерживает константность и создавая обёртки над комовскими объектами приходится этим жертвовать даже во всемогущем С++.
З.Ы.
Кто такие S>
OC8988: possible attempt to modify const object. Method Brahma.Meditiroval() misses the CompilerServices.ConstAttribute attribute
Здравствуйте, Дарней, Вы писали:
NC>>но если коротко — то этот параметр лишний.
Д>а если правильно — то разработчики решили, что реализация будет слишком сложна и возможные преимущества не окупят затрат Д>так что нормальных констант в CLI нет, и судя по всему — не будет Д>другой вопрос — правы они были или нет. Проблемы с RPC, которые создаются из-за их отстуствия — это еще цветочки
Неизменяемость объектов можно было бы обеспечить на уровне ВМ. Всё равно барьер записи используется сборщиком мусора.