Синтаксис анонимных экземпляров - хорошо или плохо? - PullRequest
3 голосов
/ 04 апреля 2009

Для быстрых задач, когда я использую только один экземпляр объекта, я знаю, что могу сделать следующее:

int FooBarResult = (new Foo()).Bar();

Я говорю, что это вполне приемлемо для одноразовых предметов и более читабельно, чем альтернатива:

Foo MyOnceUsedFoo = new Foo();
int FooBarResult = MyOnceUsedFoo.Bar();

Что вы используете и почему?
Вы когда-нибудь использовали бы этот тип анонимной инстанциации в производственном приложении?
Предпочтение: с круглыми скобками "(new Foo ()). Bar ();" или без "new Foo (). Bar ();"?

(отредактировано для отвлечения вопроса от класса Random)

Ответы [ 6 ]

8 голосов
/ 04 апреля 2009

Примечание по поводу случайных чисел: На самом деле, нет, ваш конкретный пример (new Random().Next(0,100)) совершенно неприемлем. Сгенерированные случайные числа будут далеко не одинаковыми.


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

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

6 голосов
/ 04 апреля 2009

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

Я сделал это обоими способами и на самом деле не имею предпочтений. Я предпочитаю то, что выглядит более читабельным, что сильно зависит от сложности вызываемого класса и метода.

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

3 голосов
/ 04 апреля 2009

Если вы используете объект только один раз, первый способ лучше все время.

Это короче и понятнее, потому что ясно, что вы не будете использовать объект позже.

Вероятно, он все равно будет компилироваться в один и тот же CIL, поэтому для второй формы нет никакого преимущества.

1 голос
/ 04 апреля 2009

Второй - дружественный к отладке, а первый - нет. Второй выигрывает только благодаря этому.

1 голос
/ 04 апреля 2009

Первое утверждение. Он более читабелен, имеет меньше кода и не оставляет временных переменных.

0 голосов
/ 04 апреля 2009

На самом деле первый способ создания временного * более удобочитаемый по двум причинам:

1) это более кратко

Меньше кода для чтения, нет введенных ненужных локальных переменных, нет потенциального конфликта имен с другим локальным или теневого копирования какой-либо переменной с тем же именем в прилагаемой области видимости

2) он сообщает то, чего не знает вторая форма, что объект временно используется.

Читая это, я знаю, что этот экземпляр больше никогда не будет использоваться, поэтому в моем «ментальном компиляторе», который я использую для понимания кода, который я читаю, мне не нужно сохранять ссылку на него. больше, чем код сохраняет ссылку на него.

Однако, как отмечает Мерадад, делать это с помощью класса Random не очень хорошая идея.

Как он также отмечает, излишние скобки делают его менее лаконичным; если вы не находитесь в пыльном углу языка, предположите, что компетентные программисты знают приоритет оператора языка. В этом случае, даже если я не знаю приоритет оператора, альтернативный синтаксический анализ (вызов new при возврате функции) является бессмысленным, поэтому «очевидное» чтение - это правильное чтение.

int RandomIndex = (new Random()).Next(0,100);
int RandomIndex = new Random().Next(0,100);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...