Главное меню
Мы солидарны с Украиной. Узнайте здесь, как можно поддержать Украину.

Java vs C#

Автор Karakurt, октября 8, 2010, 10:01

0 Пользователи и 1 гость просматривают эту тему.

Алексей Гринь

Цитата: RawonaM от декабря 26, 2010, 12:42
Вот, решил тут было воспользоваться автопропертями. А у них, как оказалось, невозможно выставить начальное значение! Когда этот язык доведут до ума, диез этот?
Вообще это логично, и уже доведено до ума. Если сразу после указания проперти ставить знак равенства и дефолтное значение, то встаёт вопрос: при приравнивании компилятор должен ставить значение сразу в поле (что невозможно в случае неавтоматических пропертей), или задействовать механизм пропертей (т.е. с вызовом метода)? Это во-первых. А во-вторых, если верно второе, то задействование механизма пропертей это же вызов метода, а это есть конструкция с побочными эффектами, и в таком виде ставить небезопасно — прочие поля ещё не гарантируются быть установленными, а мы можем на них, неинициализированные, надеяться. Поэтому Хейлсберг принудил проставлять значение в конструкторе, где последовательность прозрачна.
肏! Τίς πέπορδε;

RawonaM

Цитата: Алексей Гринь от декабря 26, 2010, 13:22
ЦитироватьВот, решил тут было воспользоваться автопропертями. А у них, как оказалось, невозможно выставить начальное значение!
В конструкторе поставить религия мешает?
И какой в этом глубокий смысл? А отказаться от пропертиз вообще религия мешает? Конструктор где находится, а проперти где.
Я предпочел создать вместо автопроперти нормальую проперти и вместо имплицитного поля эксплицитное с инициализацией, зато сразу видно, что происходит.

RawonaM

Цитата: Алексей Гринь от декабря 26, 2010, 13:42
Вообще это логично, и уже доведено до ума.
Не считаю. Как и с индексатором. В васике есть индексаторы, хоть бери и на васик переходи.

Алексей Гринь

Цитата: RawonaM от декабря 26, 2010, 13:50
ЦитироватьВообще это логично, и уже доведено до ума.
Не считаю.
Аргументы будут? Уж думаю у Хейлсберга опыта в языко- и компиляторостроении побольше будет.

Цитата: RawonaM от декабря 26, 2010, 13:48
Конструктор где находится, а проперти где.
И чего? В реальной жизни больше половины полей объекта ставится в конструкторе — и ничего. Никто не жалуется. А тут вдруг бида. Я вообще для приличия всегда все значения стараюсь ставить только в конструкторе. А то одно инициализировано в одном месте, другое — в другом, хрен поймёшь. Это ли разве лучше?
肏! Τίς πέπορδε;

myst

Цитата: Alone Coder от декабря 26, 2010, 11:39
Я предлагаю всего лишь указывать знаковость не в типе данных, а в самой операции.
Это типа «Итак, мы изнасиловали переменную a, как будто она беззнаковая; а сейчас мы будем её насиловать, как будто она знаковая»? :eat:

Alone Coder

Да. Между прочим, в C уже есть как минимум два случая двойного насилования: char/int8 и int/boolean.

myst

Цитата: Алексей Гринь от декабря 26, 2010, 13:18
Это не тому ли, у которого из придуманных языков популярен только один, и то среди школьников? :)
Поэтому продолжаем кушать кактус за обе щеки. Думаешь, у C сюрпризы? ;)

Цитата: Алексей Гринь от декабря 26, 2010, 13:18
У беззнаковых профит в том, что не нужно проверять нижнюю границу на выход за пределы диапазона...
Угу, особенно когда диапазон — [10;15], например.

myst


myst

Цитата: Alone Coder от декабря 26, 2010, 14:10
Между прочим, в C уже есть как минимум два случая двойного насилования: char/int8 и int/boolean.
Этот язык вообще для насильников, но в чём двойность?

Alone Coder

Типизация определяет ширину. Остальное от лукавого.

myst

Цитата: Alone Coder от декабря 26, 2010, 14:14
Типизация определяет ширину. Остальное от лукавого.
А длину она не определяет случаем или, там, вес?

Alone Coder

Вы никогда флоатами по сети не обменивались? И вавки из формата в формат не конвертировали?

arseniiv

Нет уж, в тексте, который я пересказывал (arseniiv не станет пересказывать неодобренное своей головой), явно написано, что тип определяет диапазон и операции.

RawonaM

Цитата: Алексей Гринь от декабря 26, 2010, 13:53
Аргументы будут? Уж думаю у Хейлсберга опыта в языко- и компиляторостроении побольше будет.
Какие тут аргументы? Надо и все. Поле можно инициализировать, а пропертю нельзя? Ну давайте вообще на С вернемся и нафиг оно надо.

Цитата: Алексей Гринь от декабря 26, 2010, 13:42
Если сразу после указания проперти ставить знак равенства и дефолтное значение, то встаёт вопрос: при приравнивании компилятор должен ставить значение сразу в поле (что невозможно в случае неавтоматических пропертей), или задействовать механизм пропертей (т.е. с вызовом метода)? Это во-первых. А во-вторых, если верно второе, то задействование механизма пропертей это же вызов метода, а это есть конструкция с побочными эффектами, и в таком виде ставить небезопасно — прочие поля ещё не гарантируются быть установленными, а мы можем на них, неинициализированные, надеяться. Поэтому Хейлсберг принудил проставлять значение в конструкторе, где последовательность прозрачна.
Это только для неавтоперти актуально. А для авто — имплицитному полю присваиваешь и все.

myst

Цитата: Alone Coder от декабря 26, 2010, 14:19
Вы никогда флоатами по сети не обменивались? И вавки из формата в формат не конвертировали?
А надо?

myst

Цитата: arseniiv от декабря 26, 2010, 14:23
Нет уж, в тексте, который я пересказывал (arseniiv не станет пересказывать неодобренное своей головой), явно написано, что тип определяет диапазон и операции.
Coder изобрёл новый, революционный подход. Правда, его опередили на несколько десятилетий всякие там процессороклепатели, гады, но ничего, надо бороться.

myst

Цитата: RawonaM от декабря 26, 2010, 14:54
Ну давайте вообще на С вернемся и нафиг оно надо.
Как, тебе не любо писать на C? Такой прекрасный язык! Все ксакепы только на нём и пишут. Не какой-то там Паскаль для школоты!

arseniiv

Цитата: myst от декабря 26, 2010, 15:26
Coder изобрёл новый, революционный подход.
А то я не вижу сам. ;D

Алексей Гринь

Цитата: RawonaM от декабря 26, 2010, 14:54
ЦитироватьАргументы будут? Уж думаю у Хейлсберга опыта в языко- и компиляторостроении побольше будет.
Какие тут аргументы? Надо и все. Поле можно инициализировать, а пропертю нельзя?
Я же уже объяснил выше. Проперти это среднее между полем и методом. С чего бы проперти иметь автоинициализацию как у поля вообще? Я вообще считаю, что инициализация в месте объявления - это плохая практика, скопипащенная дизайнёрами из жабки. Надо в конструкторе только. Ибо гемора много, если придётся менять код.

Цитата: RawonaM от декабря 26, 2010, 14:54
Это только для неавтоперти актуально. А для авто — имплицитному полю присваиваешь и все.
Ортогональность.

Тогда можно было бы:
Цитироватьstring Name { get; set; } = "Hello!";

Но нельзя было бы:
Цитироватьstring Name {
   set { /* Код. */ }
   get { /* Код. */ }
} = "Hello!";

(особенно актуально при изменении логики, т.к. автопроперти часто ставятся как временная заглушка и вместо автопроперти может подставляться реальный код впоследствии - пришлось бы сдвигать код в конструктор, как и надо было сначала)

На такое бы нашёлся тоже свой Равонам, который бы и это критиковал.

Короче, не умеешь пользоваться и не понимаешь принципов — не жалуйся и юзай питон и жабку. Там можно писать отличный хреновый код.
肏! Τίς πέπορδε;

Алексей Гринь

Как я уже говорил, основная причина существования свойств это вывод их в публичный интерфейс.
Поля содержат реальную, физическую информацию, в то время как свойства это логические составляющие объекта, инкапсулирующие поля.
Извне класса свойство это метод, ведущий себя чисто как поле.
Но внутри-то объявления класса свойство это обычный метод. Какая инициализация может быть у метода? Зачем она ему вообще? Если нужна автоинициализация, то энкапсулируй специально созданное вручную поле (хотя в конце концов компилятор выведен код тупо в конструктор).
Автосвойства сделаны для упрощения рутинного написания геттеров и сеттеров — и не более. С какой стати они должны эмулировать поведение полей? Если понять, что такое свойство, то можно прекрасно видеть, почему дефолтное значение для свойства есть понятие абсурдное. Свойства это просто обёртки-wrappers. Дефолтное значение для обёртки это нонсенс.
肏! Τίς πέπορδε;

Алексей Гринь

Ещё неортогональности и неясностей:

Допустимо:
Цитировать
class MyClass
{
   public string Name { get; set; } = "Hello!";
}

Недопустимо:
Цитировать
abstract class MyClass
{
   public abstract string Name { get; set; } = "Hello!";
}

Недопустимо:
Цитироватьinterace INameable
{
   string Name { get; set; } = "Hello!";
}

Ваще классно, да.

Прикол в том, что у «автосвойств» может не быть неявного поля :) Да, давайте введём ещё двадцать правил и исключений, чтобы угодить чьему-либо непониманию сего понятия :)
肏! Τίς πέπορδε;

Demetrius

Цитата: myst от декабря 26, 2010, 10:40
Вирт, как известно, вообще радикально решил эту проблему: убрал беззнаковые целые как класс.
Ну дык в жабе так же.

Alone Coder

Вы бы ещё язык микрокалькулятора вспомнили :)

myst


arseniiv

(Думаю тут попсевдооффтопить, благо тема уже раскрученная и не пропадёт из виду.)

В VCL есть готовая реализация паттерна проектирования Command (вроде его) — actions, которые позволяют синхронизировать пункты меню и кнопки на панелях, а так же при желании снабдить их простым диалогом настройки с сохранением положения панелей и кнопок на них. Последнее мне не нужно, но интересно, реализованно ли что-то для синхронизации меню и панелей стандартным классом/компонентом в .NET или каким-нибудь сторонним подключаемым. Иначе придётся писать столь полезную вещь самому.

Быстрый ответ

Обратите внимание: данное сообщение не будет отображаться, пока модератор не одобрит его.

Имя:
Имейл:
Проверка:
Оставьте это поле пустым:
Наберите символы, которые изображены на картинке
Прослушать / Запросить другое изображение

Наберите символы, которые изображены на картинке:

√36:
ALT+S — отправить
ALT+P — предварительный просмотр