Как я отключаю неявное “это” в C#?

Используйте background-blend-mode для простого оттенка

Вы можете использовать свойство background-blend-mode css:

.background-tint {
  background-color: rgba(200,100,0,.5); // Tint color
  background-blend-mode: multiply;
}

Поместить его на любой элемент с фоном изображение, и вы готовы идти.

Это свойство хорошо поддерживается в современных браузерах , НЕ , включая IE latest и Edge (состояние предварительного просмотра можно включить с флагом). Для не поддерживающих браузеров вы можете использовать polyfill .

Рабочая демонстрация


Другие параметры

Использование плоского линейного градиента и наложения нескольких фонов

.background-tint {
  background-image: 
    linear-gradient( rgba(0,0,0,.5), rgba(0,0,0,.5) ),
    url('http://placehold.it/420')
}

Я думаю, что это наиболее широко используемая техника, но у нее есть и обратная сторона: она жестко закодирована, т. Е. Нельзя просто взять урок, прикрепить его к элементу и сделать оттенок.

Вы могли бы сделать это в менее или дерзкий миксин, что-то вроде:

less

.background-tint(@tint-color, @image-url) {
  background-image: 
    linear-gradient( @tint-color, @tint-color ),
    url( @image-url )
}

sass

@mixin background-tint($tint_color, $image_url) {
  background-image: 
    linear-gradient( $tint_color, $tint_color ),
    url( $image_url )
}

Рабочая демонстрация

Использование прозрачного фона

.background-tint { position: relative; }

.background-tint::after {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(0,0,0,.5);
}

Этот метод имеет преимущество работы на большинство браузеров и это просто хороший класс, который вы добавляете к любому элементу. Недостатком является то, что если у вас есть что-то еще внутри этого элемента, вам придется обернуть его в div с некоторым видом позиционирования position: relative, который будет работать лучше всего.

Пример:

Some text here
.u-relative { position: relative; }

Рабочая демонстрация

7
задан Colin Burnett 5 June 2009 в 19:52
поделиться

10 ответов

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

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

Мой личный подход заключался в использовании символа « p 'как префикс к именам параметров публичных функций. Он ненавязчивый, простой, легко узнаваемый, и легко реализовать с помощью таких инструментов, как Resharper .

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

Используя предложенное мной соглашение об именах, вы должны написать свой конструктор по адресу:

class Foo
{
    public Foo(bool pIsAction)
    {
        this.IsAction = pIsAction;
    }

    public bool IsAction { get; private set; }
}
3
ответ дан 6 December 2019 в 11:52
поделиться

Я только что попробовал ваш код в Visual Studio 2008. Включение встроенного статического анализа приводит к следующей ошибке:

Предупреждение 3 CA1801: Microsoft.Usage: Параметр isAction of 'Foo.Foo (bool)' никогда не используется. удалять параметр или используйте его в методе body.

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

6
ответ дан 6 December 2019 в 11:52
поделиться

FxCop будет жаловаться на это, потому что параметр isAction никогда не используется. В частности, он извлечет правило CA1801: ReviewUnusedParameters.

Лично я всегда считал, что компилятор C # должен выдавать предупреждение о неиспользуемых параметрах.

2
ответ дан 6 December 2019 в 11:52
поделиться

Это меня постоянно. Я начал добавлять переменные, передаваемые в конструктор, с помощью символа «_», например:

class Foo
{    
    public Foo(bool _isAction)
    {
        this.IsAction = _isAction;
    }
    public bool IsAction { get; private set; }}
1
ответ дан 6 December 2019 в 11:52
поделиться

Вы всегда можете вернуться к венгерской нотации [Я готовлюсь к огорчению, когда набираю это]. Если вы сможете справиться с уродством, это решит вашу проблему. Это предложение, а не рекомендация.

С другой стороны, я чертовски уверен, что статический анализ кода поймает это и предупредит вас об этом. Попробуйте FxCop.

РЕДАКТИРОВАТЬ

Я использую Resharper уже больше года и знаю, что он очень умен, помогая вам с учетом регистра. Помимо других преимуществ, ваша проблема с intellisense будет решена путем установки Resharper.

РЕДАКТИРОВАТЬ 2

Я только что проверил. Ни FxCop, ни Resharper напрямую эту ошибку не обнаруживают. Что оба улавливают, так это то, что параметр isAction не используется в методе Foo. В этом случае предупреждение укажет вам на ошибку.

4
ответ дан 6 December 2019 в 11:52
поделиться

Боюсь, что нет способа отключить функцию «неявное это ». Это часть спецификации языка и компилятора, и отключить его невозможно.

Лично я не считаю это большой проблемой. По общему признанию, важно быть осторожным с использованием заглавных букв в именах элементов и параметров, но это всегда происходит в языке с учетом регистра, таком как C #.

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

1
ответ дан 6 December 2019 в 11:52
поделиться

Примечание:

Если вы используете Resharper, у вас есть несколько ярлыков, которые записывают большую часть этого кода за вас и позволяют избежать ошибки.

Вы можете либо сначала создать свойство, затем нажать Alt-Ins и выбрать «сгенерировать конструктор», либо вы можете добавить параметр «isAction» в конструктор, нажать Alt-Enter с кареткой в ​​параметре Имя параметра и выбрать Действие «Создать и инициализировать автоматическое свойство IsAction» во всплывающем меню.

0
ответ дан 6 December 2019 в 11:52
поделиться

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

0
ответ дан 6 December 2019 в 11:52
поделиться

Я думаю, что более вероятно, что разработчик выбрал «IsAction» вместо «isAction» из Intellisense. Я не думаю, что Intellisense изменит "isA" на "this.IsAction".

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

0
ответ дан 6 December 2019 в 11:52
поделиться

Это неприятная проблема в intellisense Visual Studio. Resharper в большинстве случаев понимает это правильно.

0
ответ дан 6 December 2019 в 11:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: