2012-03-24 2 views
4

У меня есть интерфейс в некоторой ссылке третьей стороны сборки, такие как:Можно ли обучить ReSharper переименовать параметры интерфейса?

public interface ITextHandler 
{ 
    void Handle(string text) 
} 

И в моем собственном проекте, я беру конкретный смысл, унаследовав это в мой собственный интерфейс:

public interface INameHandler : ITextHandler 
{ 
} 

при использовании такого инструмента, как ReSharper, я мог бы начать с:

public class Foo : INameHandler 
{ 
} 

Resharper покажет ошибку, я могу нажать на кнопку и «реализовывать интерфейсы». В результате получается:

public class Foo : INameHandler 
{ 
    public void Handle(string text) 
    { 
    } 
} 

Есть ли способ сказать ReSharper, что я хочу переименовать параметр, чтобы быть более конкретным? Я хотел бы, чтобы это осуществить «имя» вместо «текст»:

public class Foo : INameHandler 
{ 
    public void Handle(string name) 
    { 
    } 
} 

Есть ли ReSharper комментарий или что-то я могу добавить к INameHandler, что переопределяет имя параметра по умолчанию?

ответ

11

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

Рассмотрим этот код:

Foo handler = new Foo(); 
handler.Handle(name: "Hello"); 

Теперь рассмотрим этот безвредный вид рефакторинга, на основании предпочтя объявить переменную с помощью типа интерфейса вместо конкретного типа:

INameHandler handler = new Foo(); 
handler.Handle(name: "Hello"); 

Если ваши имена параметров различны, вы получите ошибку времени компиляции. Это может быть хуже, чем это - вы можете получить код, который компилирует, но изменяет значение, если вы измените порядок существующих имен параметров. Nasty, nasty stuff.

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

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

+0

Не будет ли это только дело с дополнительными параметрами? Если Handle должен взять строку, почему бы вам назвать ее по имени? –

+1

@MattJohnson: Для ясности, или, возможно, для изменения разрешения перегрузки. Хотя именованные аргументы * часто используются с необязательными параметрами, они представляют собой различные функции, которые можно использовать независимо. В частности, если метод имеет несколько параметров одного и того же типа, и не сразу видно, какой аргумент означает то, что действительно может указывать имена аргументов. Рассмотрим 'MessageBox.Show (текст:« Это текст в поле », подпись:« Bang! »)' –

+0

интересный. благодаря! –

Смежные вопросы