Какие живые шаблоны ReSharper 4+ для C # вы используете? [закрыто]


94

Какие шаблоны ReSharper 4.0 для C # вы используете?

Давайте поделимся ими в следующем формате:


[Заглавие]

Необязательное описание

Ярлык: ярлык
Доступно в: [AvailabilitySetting]

// Resharper template code snippet
// comes here

Свойства макроса (если есть):

  • Macro1 - Value - EditableOccurence
  • Macro2 - Value - EditableOccurence


Должен ли это быть на programmers.SE, потому что это субъективно?
Timwi

Этот вопрос неконструктивный, и существует много информации о живых шаблонах Resharper и шаблонах Visual Studio. programmingsolved.blogspot.com/2014/04/snippet-away.html
Тулани Чивандиква,

Ответы:


31

Простая лямбда

Так просто, так полезно - небольшая лямбда:

Ярлык : x

Доступно : C #, где разрешено выражение.

x => x.$END$

Макросы: нет.


22

Реализовать метод Dispose (bool)

Реализация Dispose Pattern Джо Даффи

Ярлык: избавиться

Доступно в: файлах C # 2.0+, где разрешено объявление члена типа.

public void Dispose()
{
    Dispose(true);
    System.GC.SuppressFinalize(this);
}

protected virtual void Dispose(bool disposing)
{
    if (!disposed)
    {
        if (disposing)
        {
            if ($MEMBER$ != null)
            {
                $MEMBER$.Dispose();
                $MEMBER$ = null;
            }
        }

        disposed = true;
    }
}

~$CLASS$()
{
    Dispose(false);
}

private bool disposed;

Свойства макроса :

  • MEMBER - Предложить переменную System.IDisposable - Редактируемое событие # 1
  • CLASS - Содержит имя типа

14

Создайте новый прибор модульного теста для некоторого типа

Ярлык: ntf
Доступно в файлах C # 2.0+, где разрешено объявление члена типа или объявление пространства имен.

[NUnit.Framework.TestFixtureAttribute]
public sealed class $TypeToTest$Tests
{
    [NUnit.Framework.TestAttribute]
    public void $Test$()
    {
        var t = new $TypeToTest$()
        $END$
    }
}

Макросы:

  • TypeToTest - нет - # 2
  • Тест - нет - V

13

Проверьте, является ли строка пустой или пустой.

Если вы используете .Net 4, вы можете предпочесть использовать string.IsNullOrWhiteSpace ().

Ярлык : sne

Доступно на : C # 2.0+, где разрешено выражение.

string.IsNullOrEmpty($VAR$)

Свойства макроса :

  • VAR - предложить переменную строкового типа. Редактируемый = правда.

11

Создать новый автономный модульный тестовый пример

Ярлык: ntc
Доступно в: файлах C # 2.0+, где разрешено объявление члена типа

[NUnit.Framework.TestAttribute]
public void $Test$()
{
    $END$
}

Макросы:

  • Тест - нет - V

10

Объявите регистратор log4net для текущего типа.

Ярлык: журнал

Доступно в: файлах C # 2.0+, где разрешено объявление члена типа.

private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof($TYPE$));

Свойства макроса :

  • TYPE - Содержит имя типа

Почему бы не использовать ре-резкость? частный статический только для чтения ILog _Logger = LogManager.GetLogger (typeof ($ CurrType $)); with $ CurrType $: Содержит имя типа
Хенрик

Потому что, если я позже изменю имя типа, мне придется обновить и эту строку кода. Мой более динамичный.
Крис Брандсма,

ReSharper автоматически переименовывает все экземпляры имени типа. GetType () тоже работает медленнее.
Ричард Дингуолл,

9

Тестовый модуль MS

Новый тест MS Test Unit с использованием синтаксиса AAA и соглашения об именах, найденных в Art Of Unit Testing

Ярлык: тестирование (или tst, или что угодно)
Доступно в файлах C # 2.0+, где разрешено объявление члена типа

[TestMethod]
public void $MethodName$_$StateUnderTest$_$ExpectedBehavior$()
{
    // Arrange
    $END$

    // Act


    // Assert

}

Свойства макроса (если есть):

  • MethodName - имя тестируемого метода
  • StateUnderTest - состояние, которое вы пытаетесь протестировать
  • ExpectedBehavior - чего вы ожидаете

8

Убедитесь, что переменная равна нулю

Ярлык: ifn
Доступно в файлах C # 2.0+

if (null == $var$)
{
    $END$
}

Проверьте, не является ли переменная нулевой

Ярлык: ifnn
Доступно в файлах C # 2.0+

if (null != $var$)
{
    $END$
}

15
Как вас повлиял переход с C ++ на C #?
Тай.

Идет хорошо с макросом «Выполнить интеллектуальное завершение» для $ var $
mklein

Хорошие "Условия Йоды" !! ... неразумно такое кодирование ;-))
bytedev

7

Написать StyleCop-совместимое резюме для конструктора класса

(если вы устали постоянно вводить длинную стандартную сводку для каждого конструктора, чтобы она соответствовала правилу StyleCop SA1642)

Ярлык: csum

Доступно на: C # 2.0+

Initializes a new instance of the <see cref="$classname$"/> class.$END$

Макросы:

  • classname - Содержит имя типа - V

7

Assert.AreEqual

Простой шаблон для добавления утверждений в модульный тест

Ярлык : ae
Доступен в : в файлах C # 2.0+, где разрешен оператор

Assert.AreEqual($expected$, $actual$);$END$

Свободная версия:

Assert.That($expected$, Is.EqualTo($actual$));$END$

7

Много лямбд

Создайте лямбда-выражение с другим объявлением переменной для упрощения вложенности.

Ярлык: la, lb, lc

Доступно в: файлах C # 3.0+, где разрешены выражения или предложения запроса.

la определяется как:

x => x.$END$

фунт определяется как:

y => y.$END$

lc определяется как:

z => z.$END$

Это похоже на Шон Кирон выше, за исключением того, что я определяю несколько живых лямбда-шаблонов для упрощения вложения лямбда-выражений. Чаще всего используется " la ", но при работе с такими выражениями могут быть полезны и другие:

items.ForEach(x => x.Children.ForEach(y => Console.WriteLine(y.Name)));

можно ли использовать имена x, y для лямбда-аргументов? если у вас есть двух-трехуровневые вложенные лямбды, вы, вероятно, не захотите запоминать, что означает x, y, z на каждом уровне. Учитывая ваш пример, я бы выбрал items.ForEach (item => ... и item.Children.ForEach (child => ... так, чтобы в конце у меня было child.Name вместо y.Name. Я не «Не думаю, что именование лямбда-аргументов можно рассматривать аналогично для индексов цикла i, j, k»
Илья Иванов

6

Ждать его...

Пауза для ввода данных пользователем перед завершением консольного приложения.

Ярлык: пауза

Доступно в: файлах C # 2.0+, где разрешен оператор

System.Console.WriteLine("Press <ENTER> to exit...");
System.Console.ReadLine();$END$

Я бы использовал Console.ReadKey(true);и позволял нажимать любую клавишу.
MasterMastic

6

Генерация свойства зависимости

Создает свойство зависимости

Ярлык: dp
Доступно в: C # 3.0, где разрешено объявление члена

public static readonly System.Windows.DependencyProperty $PropertyName$Property =
        System.Windows.DependencyProperty.Register("$PropertyName$",
                                                   typeof ($PropertyType$),
                                                   typeof ($OwnerType$));

    public $PropertyType$ $PropertyName$
    {
        get { return ($PropertyType$) GetValue($PropertyName$Property); }
        set { SetValue($PropertyName$Property, value); }
    }

$END$

Свойства макроса (если есть):

PropertyName - Без макроса - # 3
PropertyType - Предполагаемый тип, ожидаемый на этом этапе - # 2
OwnerType - Содержит имя типа - нет редактируемого вхождения


5

Уведомить об изменении свойства

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

Ярлык : npc

Доступно на : C # 2.0+, где разрешено выражение.

if (value != _$LOWEREDMEMBER$)
{
  _$LOWEREDMEMBER$ = value;
  NotifyPropertyChanged("$MEMBER$");
}

Макросы :

  • MEMBER - Содержит имя типа элемента. Не редактируется. Примечание: убедитесь, что это первое в списке.
  • LOWEREDMEMBER - значение MEMBER с первым символом в нижнем регистре. Не редактируется.

Использование : Внутри такого установщика свойств:

private string _dateOfBirth;
public string DateOfBirth
{
   get { return _dateOfBirth; }
   set
   {
      npc<--tab from here
   }
}

Предполагается, что ваша поддерживающая переменная начинается с символа «_». Замените это тем, что вы используете. Также предполагается, что у вас есть метод изменения свойства примерно так:

private void NotifyPropertyChanged(String info)
{
   if (PropertyChanged != null)
   {
      PropertyChanged(this, new PropertyChangedEventArgs(info));
   }
}

На самом деле, версия, которую я использую, основана на лямбде (потому что я люблю свои лямбды!) И дает следующее. Принципы такие же, как указано выше.

public decimal CircuitConductorLive
{
   get { return _circuitConductorLive; }
   set { Set(x => x.CircuitConductorLive, ref _circuitConductorLive, value); }
}

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


5

Быстрый ярлык ExpectedException

Просто быстрый ярлык для добавления к моим атрибутам модульного теста.

Ярлык : ее

Доступно в : Доступно в: файлах C # 2.0+, где разрешено объявление члена типа

[ExpectedException(typeof($TYPE$))]

Просто небольшое примечание, что теперь это пара версий, когда ExpectedException устарел в NUnit в пользу использования Assert.Throws <>
Stécy

Да, пожалуйста, все прекратите использовать ExpectedExceptionAttribute, все еще вижу, что разработчики, использующие MSTest, используют это даже сегодня :-(
bytedev

5

Сопоставление свойств AutoMapper

Ярлык: FM

Доступно в: файлах C # 2.0+, где разрешен оператор

.ForMember(d => d$property$, o => o.MapFrom(s => s$src_property$))
$END$

Макросы:

  • свойство - редактируемое вхождение
  • src_property - редактируемое вхождение

Примечание:

Я оставляю лямбда-точку выключенной, чтобы я мог ударить. немедленно и получить недвижимость intellisense. Требуется AutoMapper ( http://automapper.codeplex.com/ ).


4

Создать заглушку тестового примера для NUnit

Это может служить напоминанием (о функциональных возможностях для реализации или тестирования), которое отображается в средстве выполнения модульного теста (как и любой другой игнорируемый тест),

Ярлык: nts
Доступно в файлах C # 2.0+, в которых разрешено объявление члена типа

[Test, Ignore]
public void $TestName$()
{
    throw new NotImplementedException();
}
$END$

Я делаю вариацию этого, но с явным Assert.Fail () в теле: aleriel.com/blog/2010/04/07/replace-paper-with-unit-tests
Адам Лир

4

Вызвать, если требуется

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

Ярлык : inv

Доступно в : Оператор файлов C # 3.0+ разрешен

if (InvokeRequired)
{
    Invoke((System.Action)delegate { $METHOD_NAME$($END$); });
    return;
}

Макросы

  • METHOD_NAME - содержит имя члена типа

Обычно вы используете этот шаблон в качестве первого оператора в данном методе, и результат будет примерно таким:

void DoSomething(Type1 arg1)
{
    if (InvokeRequired)
    {
        Invoke((Action)delegate { DoSomething(arg1); });
        return;
    }

    // Rest of method will only execute on the correct thread
    // ...
}

4

Новый C # Guid

Создает новый экземпляр System.Guid, инициализированный новым сгенерированным значением guid

Ярлык: csguid Доступно в: в файлах C # 2.0+

new System.Guid("$GUID$")

Свойства макроса :

  • GUID - новый GUID - ложь

Последние версии ReSharper теперь по умолчанию включают ярлык nguid .
Джейми Килинг

Верно, но он генерирует только значение guid, а не инициализирует тип в C #.
codekaizen

4

Метод тестирования MSTest

Это немного неубедительно, но полезно. Надеюсь, кому-то это пригодится.

Ярлык: testMethod

Доступно в: C # 2.0

[TestMethod]
public void $TestName$()
{
    throw new NotImplementedException();

    //Arrange.

    //Act.

    //Assert.
}

$END$

4

Метод установки NUnit

Ярлык: настройка
Доступно в: Доступно в: файлах C # 2.0+, где разрешено объявление члена типа

[NUnit.Framework.SetUp]
public void SetUp()
{
    $END$
}

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

Улучшение этого ............ private $ classUnderTestType $ _classUnderTest; [NUnit.Framework.SetUp] public void SetUp () {_classUnderTest = new $ classUnderTestType $ ($ END $); }
bytedev

4

Метод NUnit Teardown

Ярлык: teardown
Доступно: Доступно: в файлах C # 2.0+, где разрешено объявление члена типа

[NUnit.Framework.TearDown]
public void TearDown()
{
    $END$
}

3

Создайте проверку работоспособности, чтобы гарантировать, что аргумент никогда не будет нулевым

Ярлык: eann
Доступно в: файлах C # 2.0+, где разрешен оператор типа

Enforce.ArgumentNotNull($inner$, "$inner$");

Макросы:

  • внутренний - Предложить параметр - # 1

Примечания. Хотя этот фрагмент нацелен на библиотеку .NET Lokad.Shared с открытым исходным кодом , его можно легко адаптировать для любого другого типа проверки аргументов.


3

Новый COM-класс

Ярлык : comclass

Доступно в : файлах C # 2.0+, где разрешено объявление члена типа или объявление пространства имен.

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[Guid("$GUID$")]
public class $NAME$ : $INTERFACE$
{
    $END$
}

Макросы

  • GUID - новый GUID
  • НАЗВАНИЕ - доступно для редактирования
  • ИНТЕРФЕЙС - редактируемый

2
Хороший шаблон, но он может лучше подходить для шаблона файла, чем для живого шаблона.
Дрю Ноукс,

3

Подтверждение вызова не требуется

Полезно при разработке приложений WinForms, когда вы хотите быть уверены, что код выполняется в правильном потоке для данного элемента. Обратите внимание, что Controlфайлы ISynchronizeInvoke.

Ярлык : ани

Доступно в : Допускается оператор файлов C # 2.0+

Debug.Assert(!$SYNC_INVOKE$.InvokeRequired, "InvokeRequired");

Макросы

  • SYNC_INVOKE - Предложить переменную дляSystem.ComponentModel.ISynchronizeInvoke

2

Trace - Writeline, с форматом

Очень простой шаблон для добавления трассировки с форматированной строкой (например, Debug.WriteLine уже поддерживает).

Ярлык: twlf
Доступно в файлах C # 2.0+, где разрешен оператор

Trace.WriteLine(string.Format("$MASK$",$ARGUMENT$));

Свойства макроса:

  • Аргумент - value- EditableOccurence
  • Маска - "{0}"- EditableOccurence

1

Новый изолятор Typemock подделка

Ярлык : fake
Доступно в : [в файлах C # 2.0, где разрешено выражение]

$ TYPE $ $ Name $ Fake = Isolate.Fake.Instance ();
Isolate.WhenCalled (() => $ Name $ Fake.)

Свойства макроса:
* $ TYPE $ - Предложить тип для новой переменной
* $ Name $ - Значение другой переменной ( Тип ) с первым символом в нижнем регистре


1

Поскольку сейчас я работаю с Unity, я придумал несколько, чтобы немного облегчить себе жизнь:


Тип Псевдоним

Ярлык : ta
Доступен в : * .xml; * .config

<typeAlias alias="$ALIAS$" type="$TYPE$,$ASSEMBLY$"/>

Объявление типа

Это тип без имени и без аргументов

Ярлык : tp
Доступно в : * .xml; * .config

<type type="$TYPE$" mapTo="$MAPTYPE$"/>

Объявление типа (с именем)

Это тип с именем и без аргументов

Ярлык : tn
Доступно в : * .xml; * .config

<type type="$TYPE$" mapTo="$MAPTYPE$" name="$NAME$"/>

Объявление типа с конструктором

Это тип с именем и без аргументов

Ярлык : tpc
Доступно в : * .xml; * .config

<type type="$TYPE$" mapTo="$MAPTYPE$">
  <typeConfig>
    <constructor>
        $PARAMS$
    </constructor>
  </typeConfig>
</type>

и т.д....


1

Блок конфигурации XML log4net

Вы можете напрямую импортировать шаблон:

<TemplatesExport family="Live Templates">
  <Template uid="49c599bb-a1ec-4def-a2ad-01de05799843" shortcut="log4" description="inserts log4net XML configuration block" text="  &lt;configSections&gt;&#xD;&#xA;    &lt;section name=&quot;log4net&quot; type=&quot;log4net.Config.Log4NetConfigurationSectionHandler,log4net&quot; /&gt;&#xD;&#xA;  &lt;/configSections&gt;&#xD;&#xA;&#xD;&#xA;  &lt;log4net debug=&quot;false&quot;&gt;&#xD;&#xA;    &lt;appender name=&quot;LogFileAppender&quot; type=&quot;log4net.Appender.RollingFileAppender&quot;&gt;&#xD;&#xA;      &lt;param name=&quot;File&quot; value=&quot;logs\\$LogFileName$.log&quot; /&gt;&#xD;&#xA;      &lt;param name=&quot;AppendToFile&quot; value=&quot;false&quot; /&gt;&#xD;&#xA;      &lt;param name=&quot;RollingStyle&quot; value=&quot;Size&quot; /&gt;&#xD;&#xA;      &lt;param name=&quot;MaxSizeRollBackups&quot; value=&quot;5&quot; /&gt;&#xD;&#xA;      &lt;param name=&quot;MaximumFileSize&quot; value=&quot;5000KB&quot; /&gt;&#xD;&#xA;      &lt;param name=&quot;StaticLogFileName&quot; value=&quot;true&quot; /&gt;&#xD;&#xA;&#xD;&#xA;      &lt;layout type=&quot;log4net.Layout.PatternLayout&quot;&gt;&#xD;&#xA;        &lt;param name=&quot;ConversionPattern&quot; value=&quot;%date [%3thread] %-5level %-40logger{3} - %message%newline&quot; /&gt;&#xD;&#xA;      &lt;/layout&gt;&#xD;&#xA;    &lt;/appender&gt;&#xD;&#xA;&#xD;&#xA;    &lt;appender name=&quot;ConsoleAppender&quot; type=&quot;log4net.Appender.ConsoleAppender&quot;&gt;&#xD;&#xA;      &lt;layout type=&quot;log4net.Layout.PatternLayout&quot;&gt;&#xD;&#xA;        &lt;param name=&quot;ConversionPattern&quot; value=&quot;%message%newline&quot; /&gt;&#xD;&#xA;      &lt;/layout&gt;&#xD;&#xA;    &lt;/appender&gt;&#xD;&#xA;&#xD;&#xA;    &lt;root&gt;&#xD;&#xA;      &lt;priority value=&quot;DEBUG&quot; /&gt;&#xD;&#xA;      &lt;appender-ref ref=&quot;LogFileAppender&quot; /&gt;&#xD;&#xA;    &lt;/root&gt;&#xD;&#xA;  &lt;/log4net&gt;&#xD;&#xA;" reformat="False" shortenQualifiedReferences="False">
    <Context>
      <FileNameContext mask="*.config" />
    </Context>
    <Categories />
    <Variables>
      <Variable name="LogFileName" expression="getOutputName()" initialRange="0" />
    </Variables>
    <CustomProperties />
  </Template>
</TemplatesExport>

1

Сделать метод виртуальным

Добавляет виртуальное ключевое слово. Особенно полезно при использовании NHibernate, EF или аналогичной инфраструктуры, где методы и / или свойства должны быть виртуальными, чтобы обеспечить ленивую загрузку или проксирование.

Ярлык: v

Доступно в: файле C # 2.0+, где разрешено объявление члена типа

virtual $END$

Хитрость здесь в том, что после виртуального стоит пробел, который может быть трудно увидеть выше. Фактический шаблон - это «виртуальный $ END $» с включенным переформатированным кодом. Это позволяет вам перейти к точке вставки ниже (обозначенной |) и ввести v:

public |string Name { get; set; }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.