И снова про константность
От: chudo19  
Дата: 19.11.05 11:06
Оценка:
В который раз декларирую функцию и по привычке из C++ тянет const написать для параметра.
И каждый раз эта ментальная ломка.

Не помойму я. Не ужели построение NET не позволяет добавить это в копилятор?
Как мне кажется это ни как не затрагивает внутренности .NET, а лишь касается компилятора.
Да и можно зделать это чуть красивше чем в C++ — чтоб обойти было не возможно всякими кросскастами.
Или у создателей личная неприязнь к const?




28.11.05 08:04: Перенесено модератором из '.NET' — TK
Re: И снова про константность
От: GlebZ Россия  
Дата: 19.11.05 12:32
Оценка: 7 (2)
Здравствуйте, chudo19, Вы писали:

Если кратко, то:
Константный параметр
Автор: korzey
Дата: 07.07.05

Константность.
Автор: Sir Wiz
Дата: 07.10.04

все-таки не пойму... почему в CLR нет константных ссылок?
Автор: Дарней
Дата: 08.12.03

ПОЧЕМУ В C# НЕТ КОНСТАНТНЫХ АРГУМЕНТОВ
Автор: XRonos
Дата: 27.09.02

Исследование readonly
Автор: Dr_Sh0ck
Дата: 02.06.03


С уважением, Gleb.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: И снова про константность
От: Nickolay Ch  
Дата: 19.11.05 13:44
Оценка: -3
C>В который раз декларирую функцию и по привычке из C++ тянет const написать для параметра.
C>И каждый раз эта ментальная ломка.

Управляемая среда после неуправляемой — это в любом случае ментальная ломка.

C>Не помойму я. Не ужели построение NET не позволяет добавить это в копилятор?

C>Как мне кажется это ни как не затрагивает внутренности .NET, а лишь касается компилятора.
C>Да и можно зделать это чуть красивше чем в C++ — чтоб обойти было не возможно всякими кросскастами.
C>Или у создателей личная неприязнь к const?

Уже был хороший ответ с подборкой ссылок, но если коротко — то этот параметр лишний.
Re[2]: И снова про константность
От: chudo19  
Дата: 19.11.05 15:56
Оценка: +1 -1 :)
Здравствуйте, Nickolay Ch, Вы писали:


NC>Уже был хороший ответ с подборкой ссылок, но если коротко — то этот параметр лишний.

Читал я все это.
Как это лишний!?

Тогда как запретить модификацию дочернего объекта возвращаемого через проперти?
Только не надо насчет создания readonly интерфейсов.
это во первых не всегда возможно,во вторых очень убого и каряво если начать на каждый обект огород городить.
Re: И снова про константность
От: Аноним  
Дата: 20.11.05 01:48
Оценка: +3 :)
Здравствуйте, chudo19, Вы писали:


C>Или у создателей личная неприязнь к const?


Наверное. Если взять доступные С++ исходники от МS (MFC, ATL, MSDN samples) — const для парметров (кроме copy constructors and assignment operators) и функций-членов практ. не используется. Может у них запрещено? Да и вообще, только в ATL можно действительно "настоящий" С++ местами увидеть, остальное, IMHO, больше похоже на "первые шаги С программиста в С++".
Re[3]: И снова про константность
От: Codechanger Россия  
Дата: 20.11.05 09:39
Оценка:
Здравствуйте, chudo19, Вы писали:

C>Здравствуйте, Nickolay Ch, Вы писали:



NC>>Уже был хороший ответ с подборкой ссылок, но если коротко — то этот параметр лишний.

C>Читал я все это.
C>Как это лишний!?

C>Тогда как запретить модификацию дочернего объекта возвращаемого через проперти?

C>Только не надо насчет создания readonly интерфейсов.
C>это во первых не всегда возможно,во вторых очень убого и каряво если начать на каждый обект огород городить.

Ну как, как запретить... СОздать проперти, у которой метод set не реализовывать.
Re[4]: И снова про константность
От: IDecember Россия  
Дата: 21.11.05 07:01
Оценка:
Здравствуйте, 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;
        }
    }
}
Re: И снова про константность
От: chudo19  
Дата: 21.11.05 18:06
Оценка: :)
Предлагаю начать собирать подписи. Авось их проймет.
Re[2]: И снова про константность
От: GlebZ Россия  
Дата: 21.11.05 19:06
Оценка: +1
Здравствуйте, chudo19, Вы писали:

C>Предлагаю начать собирать подписи. Авось их проймет.

Собирать подписи легко. А теперь представь себе что у тебя есть несколько языков. Ну например тот-же паскаль. Интерфейс у тебя содержит константные параметры. Твоя задача написать реализацию данного интерфейса. Но это сделать нельзя, поскольку у языка нет такого понятия как константные параметры в принципе. И сэмулировать внутренними средствами нельзя. Результат понятен. Паскаль никогда не станет CRL совместимым языком. Поэтому к таким шнягам очень осторожно относятся.

С уважением, Gleb.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: И снова про константность
От: _FRED_ Черногория
Дата: 21.11.05 22:09
Оценка: +1 :)
Здравствуйте, GlebZ, Вы писали:

GZ>А теперь представь себе что у тебя есть несколько языков. Ну например тот-же паскаль. Интерфейс у тебя содержит константные параметры. Твоя задача написать реализацию данного интерфейса. Но это сделать нельзя, поскольку у языка нет такого понятия как константные параметры в принципе. И сэмулировать внутренними средствами нельзя.


Ну и что? Во времена шестого басика тоже нельзя было ко многим интерфейсам доступ получить… И компоненты разделялись на "доступные из бейсика и недоступные"

Даже в ВБ.НЕТ поначалу беззнаковых целых небыло…

GZ> Результат понятен. Паскаль никогда не станет CRL совместимым языком. Поэтому к таким шнягам очень осторожно относятся.


Тююю… Бейсик же стал? (по сравнению с тем, что до дотНета было)
Help will always be given at Hogwarts to those who ask for it.
Re[2]: И снова про константность
От: Дарней Россия  
Дата: 22.11.05 02:56
Оценка:
Здравствуйте, Nickolay Ch, Вы писали:

NC>но если коротко — то этот параметр лишний.


а если правильно — то разработчики решили, что реализация будет слишком сложна и возможные преимущества не окупят затрат
так что нормальных констант в CLI нет, и судя по всему — не будет
другой вопрос — правы они были или нет. Проблемы с RPC, которые создаются из-за их отстуствия — это еще цветочки
... << RSDN@Home 1.1.4 stable rev. 510>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[4]: И снова про константность
От: GlebZ Россия  
Дата: 22.11.05 09:35
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Ну и что? Во времена шестого басика тоже нельзя было ко многим интерфейсам доступ получить… И компоненты разделялись на "доступные из бейсика и недоступные"


_FR>Даже в ВБ.НЕТ поначалу беззнаковых целых небыло…

И непонятно зачем ввели CLS совместимый язык содержит только беззнаковые переменные
А теперь подумай, чем грозит ввод констант, чем грозит то, что модуль на другом языке изменит значение такого параметра.

_FR>Тююю… Бейсик же стал? (по сравнению с тем, что до дотНета было)

Ну VB.NET и VB6 — два разных языка с похожим синтаксисом. Есть возражения?

С уважением, Gleb.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: И снова про константность
От: _FRED_ Черногория
Дата: 22.11.05 12:15
Оценка:
Здравствуйте, GlebZ, Вы писали:

_FR>>Ну и что? Во времена шестого басика тоже нельзя было ко многим интерфейсам доступ получить… И компоненты разделялись на "доступные из бейсика и недоступные"


_FR>>Даже в ВБ.НЕТ поначалу беззнаковых целых небыло…

GZ>И непонятно зачем ввели CLS совместимый язык содержит только беззнаковые переменные
GZ>А теперь подумай, чем грозит ввод констант, чем грозит то, что модуль на другом языке изменит значение такого параметра.

Какого "такого"? Константного или беззнакового? Допустим, константного. Тут два варианта. Или "другой язык" понимает константность, но тогда неинтересно, либо не понимает. Тогда он её не видит и не может до неё доступиться. Не знает о ней и всё. И ничего страшного в этом нету. Обидно, когда вот такой метод понадобится… Но выкрутиться всегда можно (неконстантной обёрткой например на том же шарпе). Через одно место способ? Да. Но он есть. А константности нет

Хотя, пообвыкнув, замечаю, что не так уж она и необходима Можно завести свой ConstantAttribute и проверять его из FxCop или тем же R#. На этапе компиляции, думается мне, не такая уж это архисложная задача для того, кто по настоящему тоскует Уж всяк быстрее, чем подписи собирать и ждать того, чего, скорее всего, не будет.

_FR>>Тююю… Бейсик же стал? (по сравнению с тем, что до дотНета было)

GZ>Ну VB.NET и VB6 — два разных языка с похожим синтаксисом. Есть возражения?

Напротив, подтверждение! Кто мешает расширить синтаксис паскаля или создать на его основе новый язык
<< RSDN@Home 1.2.0 alpha rev. 616 >> =03:03= [Windows 2003 — 5.2.3790.65536]
under «*none*»
Help will always be given at Hogwarts to those who ask for it.
Re[6]: И снова про константность
От: GlebZ Россия  
Дата: 22.11.05 13:32
Оценка:
Здравствуйте, _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?

С уважением, Gleb.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[7]: И снова про константность
От: _FRED_ Черногория
Дата: 28.11.05 01:12
Оценка:
Здравствуйте, GlebZ, Вы писали:

_FR>>Какого "такого"? Константного или беззнакового? Допустим, константного. Тут два варианта. Или "другой язык" понимает константность, но тогда неинтересно, либо не понимает. Тогда он её не видит и не может до неё доступиться. Не знает о ней и всё. И ничего страшного в этом нету. Обидно, когда вот такой метод понадобится… Но выкрутиться всегда можно (неконстантной обёрткой например на том же шарпе). Через одно место способ? Да. Но он есть. А константности нет

GZ>Ничего не понял.
GZ>Давай, немного опишу насколько сложно, нетривиально, и скорее всего не нужно.
GZ>Value объекты и muttable отметаем сразу. Они по определению константны.
GZ>Например у нас сеть метод.


GZ>void Brahmaputra(const /* сИнее!!!, а тег [с#] :о))) */ Brahma putra)
GZ>{
GZ>  putra.Meditiroval();
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.
Re[8]: И снова про константность
От: _FRED_ Черногория
Дата: 28.11.05 01:28
Оценка:
Здравствуйте, _FRED_, Вы писали:


GZ>>Например у нас сеть метод.
GZ>>void Brahmaputra(const Brahma putra)
GZ>>{
GZ>>  putra.Meditiroval();
GZ>>}

GZ>>Итак, что мы здесь видим. Мы поставили const(также как в C++), который нам гарантирует что putra не изменит своего состояния.
GZ>>Для того чтобы так было, у нас есть обязанность, чтобы язык который реализовал putra — должен поддерживать информацию о том, что метод putra.Meditiroval() — не изменяет внутреннего состояния объекта. Без такой информации, модель работать не может. Если Brahma написан на языке не поддерживающем константность, то как и не извращайся, то....... Вобщем лучше не извращаться.

_FR>И что плохого


В смысле, чем это отличается от того, что в Brahma есть одно единственное свойство Value типа uint??? Хуже — не будет, но верю, что потребует изменения «самых потрохов» и не настаиваю
<< RSDN@Home 1.2.0 alpha rev. 616 >> =04:28= [Windows 2003 — 5.2.3790.65536]
under «*none*»
Help will always be given at Hogwarts to those who ask for it.
Re[2]: И снова про константность
От: jazzer Россия Skype: enerjazzer
Дата: 28.11.05 08:25
Оценка:
Здравствуйте, Nickolay Ch, Вы писали:

NC>Уже был хороший ответ с подборкой ссылок, но если коротко — то этот параметр лишний.


Не лишний. Это — декларация о намерениях вызывающего кода, часть его контракта.
Сейчас возможности задать такой контракт в C# нет.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[8]: И снова про константность
От: Sinclair Россия https://github.com/evilguest/
Дата: 28.11.05 09:35
Оценка: 1 (1) +1
Здравствуйте, _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
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[9]: И снова про константность
От: _FRED_ Черногория
Дата: 28.11.05 10:19
Оценка:
Здравствуйте, Sinclair, Вы писали:

_FR>>И что плохого

[…]
Согласен со всем

S>…После чего понимаешь, что const — штука хорошая, но нежизнеспособная.


Жизнеспособная, например, в рамках группы языков, поддерживающих константность. Этого более чем достаточно. Если же язык константность не поддерживает, то да, с ним и должно быть всё нехорошо. Например [могу грубо ошибиться, поправьте кто знает лучше], спецификация COM вроде бы не поддерживает константность и создавая обёртки над комовскими объектами приходится этим жертвовать даже во всемогущем С++.

З.Ы.
Кто такие
S>

OC8988: possible attempt to modify const object. Method Brahma.Meditiroval() misses the CompilerServices.ConstAttribute attribute

сообщения выдавать умеет?
<< RSDN@Home 1.2.0 alpha rev. 616 >> =01:19= [Windows 2003 — 5.2.3790.65536]
under «*none*»
Help will always be given at Hogwarts to those who ask for it.
Re[3]: И снова про константность
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 28.11.05 11:13
Оценка:
Здравствуйте, Дарней, Вы писали:

NC>>но если коротко — то этот параметр лишний.


Д>а если правильно — то разработчики решили, что реализация будет слишком сложна и возможные преимущества не окупят затрат

Д>так что нормальных констант в CLI нет, и судя по всему — не будет
Д>другой вопрос — правы они были или нет. Проблемы с RPC, которые создаются из-за их отстуствия — это еще цветочки

Неизменяемость объектов можно было бы обеспечить на уровне ВМ. Всё равно барьер записи используется сборщиком мусора.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.