Это пришло мне в голову после того, как я узнал следующее из этого вопроса :
where T : struct
Мы, разработчики C #, все знаем основы C #. Я имею в виду объявления, условия, циклы, операторы и т. Д.
Некоторые из нас даже освоили такие вещи, как Generics , анонимные типы , лямбды , LINQ , ...
Но каковы наиболее скрытые функции или уловки C #, которые даже фанаты C #, наркоманы, эксперты едва знают?
Вот некоторые выявленные особенности:
Ключевые слова
yield
от Michael Штумаvar
от Michael Штумаusing()
заявление кокосаreadonly
по KOKOSas
от Mike Stoneas
/is
От Ed Swangrenas
/is
(улучшено) от Rocketpantsdefault
по deathofratsglobal::
по pzycomanusing()
блоки от AlexCusevolatile
по Якуб Šturcextern alias
по Якуб Šturc
Атрибуты
DefaultValueAttribute
от Michael ШтумаObsoleteAttribute
от DannySmurfDebuggerDisplayAttribute
по StuDebuggerBrowsable
иDebuggerStepThrough
по bdukesThreadStaticAttribute
по marxidadFlagsAttribute
по Мартин КларкConditionalAttribute
от AndrewBurns
Синтаксис
??
(объединить нули) оператор Kokos- Числовая маркировка Ника Берарди
where T:new
по Lars Mæhlum- Неявные дженерики Кейта
- Однопараметрические лямбды Китом
- Авто свойства по Кит
- Псевдонимы пространства имен Китом
- Дословные строковые литералы с @ Патриком
enum
значения по lfoust- @variablenames от marxidad
event
операторы Марксидад- Строковые скобки формата от Portman
- Модификаторы доступа к свойствам от xanadont
- Условный (троичный) оператор (
?:
) по JasonS checked
иunchecked
операторы Биной Антонийimplicit and explicit
операторы Флори
Особенности языка
- Обнуляемые типы от Брэда Баркера
- Анонимные типы Китом
__makeref __reftype __refvalue
от Иуды Himango- Инициализаторы объектов lomaxx
- Формат строки Дэвида в Дакоте
- Методы расширения от marxidad
partial
методы Джон Эриксон- Директивы препроцессора Джона Асбека
DEBUG
директива препроцессора Роберта Дургина- Перегрузка оператора по SefBkn
- Вывод типа по чакриту
- Булевы операторы , принятые на следующий уровень по Rob Гоф
- Передать переменную типа значения в качестве интерфейса без бокса от Романа Бойко
- Программно определить объявленный тип переменной Романом Бойко
- Статические Конструкторы Крисом
- Упрощенное визуальное / сжатое ORM-картирование с использованием LINQ от roosteronacid
__arglist
от Zac Боулинг
Особенности Visual Studio
- Выделить блок текста в редакторе Химадри
- Фрагменты от DannySmurf
Фреймворк
TransactionScope
от KiwiBastardDependantTransaction
от KiwiBastardNullable<T>
от IainMHMutex
по DiagoSystem.IO.Path
по возрастуWeakReference
от Juan Manuel
Методы и свойства
String.IsNullOrEmpty()
метод от KiwiBastardList.ForEach()
метод от KiwiBastardBeginInvoke()
,EndInvoke()
методы Уилла ДинаNullable<T>.HasValue
иNullable<T>.Value
свойства RismoGetValueOrDefault
метод Джон Шиэн
Советы и хитрости
- Хороший метод для обработчиков событий от Andreas HR Nilsson
- Прописные сравнения Джона
- Доступ к анонимным типам без отражения от dp
- Быстрый способ ленивой реализации свойств коллекции с помощью Will
- Подобные JavaScript анонимные inline-функции от roosteronacid
Другой
- сетевые модули от kokos
- LINQBridge от Дункан Смарт
- Параллельные расширения от Джоэла Коухорна
источник
"a".Equals("A", StringComparison.OrdinalIgnoreCase)
Мой любимый трюк - использование оператора null coalesce и круглых скобок для автоматического создания экземпляров коллекций для меня.
источник
Избегайте проверки на нулевые обработчики событий
Добавление пустого делегата к событиям при объявлении, устранение необходимости всегда проверять событие на null, прежде чем вызывать его, - это здорово. Пример:
Позволь тебе сделать это
Вместо этого
Пожалуйста, также посмотрите эту связанную дискуссию и этот блог Эрика Липперта на эту тему (и возможные недостатки).
источник
Все остальное плюс
1) неявные дженерики (почему только для методов, а не для классов?)
2) простые лямбды с одним параметром:
3) анонимные типы и инициализаторы:
Другой:
4) Авто свойства могут иметь разные области видимости:
Спасибо @pzycoman за напоминание:
5) Псевдонимы пространства имен (не то, что вам, вероятно, понадобится это конкретное различие):
источник
new web.Control()
также будет работать в этом примере. В::
синтаксических заставляет его лечить префикс как псевдоним пространства имен, так что вы могли бы иметь класс с именемweb
иweb::Control
синтаксис будет по- прежнему работать, в то время какweb.Control
синтаксис не будет знать , проверять ли класс или пространство имен. Из-за этого я обычно использую::
псевдонимы пространства имен.Я давно не знал ключевое слово "как".
против
Вторая вернет ноль, если obj не является MyClass, а не сгенерирует исключение приведения класса.
источник
Две вещи, которые мне нравятся, это свойства Automatic, так что вы можете свернуть свой код еще дальше:
становится
Также инициализаторы объекта:
становится
источник
[DefaultValue]
используется для дизайнера, поэтому он знает, показывать ли свойство жирным шрифтом (то есть не по умолчанию).Ключевое слово «default» в универсальных типах:
приводит к нулю, если T является ссылочным типом, и 0, если это int, и false, если это логическое значение, и так далее.
источник
Атрибуты в целом, но больше всего DebuggerDisplay . Спасает тебя годы.
источник
Просто хотел уточнить это ... он не говорит ему игнорировать escape-символы, он на самом деле говорит компилятору интерпретировать строку как литерал.
Если у тебя есть
он будет фактически распечатан как (обратите внимание, что он даже включает пробелы, используемые для отступа):
источник
{{
на{
и}}
на что}
делает его полезным дляstring.Format()
.Я думаю, что одной из наиболее недооцененных и менее известных функций C # (.NET 3.5) являются деревья выражений , особенно сочетании с Generics и Lambdas. Это подход к созданию API, который используют более новые библиотеки, такие как NInject и Moq.
Например, предположим, что я хочу зарегистрировать метод с помощью API, и что API должен получить имя метода
Учитывая этот класс:
Раньше разработчики часто делали это со строками и типами (или что-то еще, в основном, на основе строк):
Ну, это отстой из-за отсутствия строгой типизации. Что если я переименую "SomeMethod"? Теперь, в 3.5, я могу сделать это строго типизированным способом:
В котором класс RegisterMethod использует
Expression<Action<T>>
так:Это одна из причин, по которой я влюблен в Lambdas и Expression Trees прямо сейчас.
источник
EditValue(someEmployee, e => e.FirstName);
в моей бизнес-логике, и он автоматически генерировал всю логику для ViewModel и View для редактирования этого свойства (так, метка с текстом «Имя» и TextBox с привязка, которая вызывает установщик свойства FirstName, когда пользователь редактирует имя и обновляет представление с использованием метода получения). Это, кажется, основа для большинства новых внутренних DSL в C #." доходность " пришла бы мне в голову. Некоторые из атрибутов, таких как [DefaultValue ()] , также среди моих любимых.
Ключевое слово " var " немного более известно, но его можно использовать и в приложениях .NET 2.0 (если вы используете компилятор .NET 3.5 и устанавливаете его для вывода кода 2.0), кажется не очень известным хорошо.
Редактировать: kokos, спасибо за указание ?? оператор, это действительно очень полезно. Так как в нем сложно найти Google (так как ?? просто игнорируется), вот страница документации MSDN для этого оператора: ?? Оператор (C # Reference)
источник
Я склонен находить, что большинство разработчиков на C # не знают о «обнуляемых» типах. В основном, примитивы, которые могут иметь нулевое значение.
Установите обнуляемую двойные, num1 , в нуль, а затем установить регулярную двойные, num2 , чтобы num1 или -100 , если num1 был нулевой.
http://msdn.microsoft.com/en-us/library/1t3y8s4s(VS.80).aspx
Еще одна вещь о типе Nullable:
это возвращение String.Empty. Проверьте эту ссылку для более подробной информации
источник
as
операторами) с помощью одних обобщений. Одно только Nullable <T> является рудиментарным и далеко не звездным, но концепция обнуляемых типов как части языка - это задница.Вот некоторые интересные скрытые возможности C # в форме недокументированных ключевых слов C #:
Это недокументированные ключевые слова C # (даже Visual Studio распознает их!), Которые были добавлены для более эффективной упаковки / распаковки до использования обобщений. Они работают в координации со структурой System.TypedReference.
Также есть __arglist, который используется для списков параметров переменной длины.
Одна вещь, о которой мало кто знает, это System.WeakReference - очень полезный класс, который отслеживает объект, но все же позволяет сборщику мусора собирать его.
Наиболее полезной «скрытой» функцией будет ключевое слово yield return. Это на самом деле не скрыто, но многие люди не знают об этом. LINQ построен на этом; он позволяет выполнять запросы с задержкой, генерируя конечный автомат. Раймонд Чен недавно опубликовал информацию о внутренних мелочах .
источник
Союзы (вид разделяемой памяти C ++) в чистом, безопасном C #
Не прибегая к небезопасному режиму и указателям, вы можете сделать так, чтобы члены класса совместно использовали пространство памяти в классе / структуре. Учитывая следующий класс:
Вы можете изменять значения полей байтов, манипулируя полем Int32 и наоборот. Например, эта программа:
Выводы это:
просто добавьте с помощью System.Runtime.InteropServices;
источник
Использование @ для имен переменных, которые являются ключевыми словами.
источник
Если вы хотите выйти из вашей программы без вызова каких-либо блоков finally или финализаторов, используйте FailFast :
источник
Возврат анонимных типов из метода и доступ к членам без отражения.
источник
Вот полезный пример для регулярных выражений и путей к файлам:
Символ @ указывает компилятору игнорировать любые escape-символы в строке.
источник
Примеси. По сути, если вы хотите добавить функцию к нескольким классам, но не можете использовать один базовый класс для всех них, попросите каждый класс реализовать интерфейс (без членов). Затем напишите метод расширения для интерфейса , т.е.
Конечно, некоторая ясность принесена в жертву. Но это работает!
источник
Верно, Неверно , FileNotFound ?
источник
Этот не "спрятан" так, как его неправильно называют.
Большое внимание уделяется алгоритмам «карта», «уменьшить» и «фильтр». Большинство людей не осознают, что в .NET 3.5 добавлены все три из этих алгоритмов, но он дал им очень SQL-имена, основываясь на том факте, что они являются частью LINQ.
Возможность использовать LINQ для выполнения встроенной работы с коллекциями, которые использовались для итераций и условных выражений, может быть невероятно полезной. Стоит узнать, как все методы расширения LINQ могут сделать ваш код намного более компактным и обслуживаемым.
источник
для системных независимых строк.
источник
Если вы пытаетесь использовать фигурные скобки внутри выражения String.Format ...
источник
[
и]
являются квадратными скобками, и<
и>
являются угловыми скобками. См. En.wikipedia.org/wiki/Bracket .источник
@ Эд, я немного неохотно пишу, потому что это немного больше, чем придирки. Однако я хотел бы отметить, что в вашем примере кода:
Если вы собираетесь использовать «is», зачем использовать безопасное приведение с использованием «as»? Если вы убедились, что obj действительно MyClass, это стандартное приведение:
... никогда не потерпит неудачу.
Точно так же вы могли бы просто сказать:
Я не знаю достаточно о внутренностях .NET, чтобы быть уверенным, но мои инстинкты говорят мне, что это сократит не более двух операций приведения типов до максимум одной. Вряд ли в любом случае сломать процессинговый банк; лично я думаю, что последняя форма тоже выглядит чище.
источник
is
иas
не будет делать приведения пользователя. Таким образом, вышеприведенный код спрашивает уis
оператора, является ли объект obj производным от MyClass (или имеет неявную приведенную систему приведения). Кроме того,is
не удаетсяnull
. Оба этих крайних случая могут быть важны для вашего кода. Например, вы можете написать: «if( obj == null || obj is MyClass ) c = (MyClass)obj;
Но это строго отличается от:try { c = (MyClass)obj; } catch { }
так как первый не будет выполнять какие-либо определенные пользователем преобразования, но последний будет выполнять. Безnull
проверки первый также не будет установлен,c
когдаobj
естьnull
.IEnumerable<int>
кList<int>
и castingobject
(new object()
)IEnumerable<int>
, чтобы убедиться, что ошибок нет: прямое приведение: 5.43ns, is-> as приведение: 6.75ns, приведение: 5.69ns. Затем тестирование неверных приведений: прямое приведение: 3125000 нс, приведение: 5,41 нс. Вывод: перестаньте беспокоиться о факторе 1%, и просто убедитесь, что вы используете /, поскольку приведение может быть недопустимым, потому что исключения (также если они обрабатываются) ОЧЕНЬ медленны по сравнению с приведением, мы говорим о факторе 578000 медленнее. Помните, что последняя часть, остальное не имеет значения (.Net FW 4.0, выпуск сборки)Возможно, не продвинутая техника, но та, которую я вижу все время, которая сводит меня с ума:
может быть сжат до:
источник