2013-07-22 4 views
2

Использует ref Плохое программирование? Я делаю рефакторинг моего старого кода, который на самом деле использует ref. Я включил анализ кода с установкой Microsoft All Rules и правила говорят, что «Не передавать типы по ссылке»Использование ref - Хорошая практика программирования или нет

Причина: Открытый или защищенный метод в общедоступном типе имеет параметр ref, который принимает примитивный тип, ссылочный тип или тип значения, который не является одним из встроенных типов.

Почему это действительно плохо? Могу ли я использовать их в своих личных методах или внутренних методах? Использование ref в частных/внутренних методах будет хорошей практикой программирования или же?

Edit: Вот некоторые образцы,

public void DoAutoScrollReverse(Rectangle rectangle, int xPosition, int yPosition, 
    ref int deltaX, ref int deltaY) 
{ 
} 

public bool GetPointCoords(Graphics g, Point pMouse, DisplayBlock2D aBlock, 
    ref Point3MD pt, ref DisplayPoint2D 2dPoint, ref double gapPos) 
{ 
} 

Что происходит внутри этих функций является то, что они инициализации, установите, или любой другой.

Обновление: Почему я использую ref? Ну, на самом деле я нет. Его старый код, который мне нужен для рефакторинга. Я избавился от некоторых методов, но сложных функций, подобных во втором примере, я не могу. Существует функция, которая возвращает bool (говорит операцию успешно или нет) и имеет 3 значения ref для разных объектов. Что мне здесь делать? сделайте это частным/внутренним (использует ref в частной/внутренней хорошей практике?)

+2

PLZ читает http://www.yoda.arachsys.com/csharp/parameters.html, а также ответы на http://stackoverflow.com/questions/1981916/c-sharp-ref-keyword-usage –

+2

Мы надеваем У меня почти достаточно контекста, чтобы ответить на это. 'ref' не * всегда * плохой, но его обычно стоит избегать и часто неправильно понимают. Если бы вы могли дать нам пример того, где вы собираетесь его использовать, это очень поможет. –

+0

@JonSkeet добавил некоторые определения методов метода, –

ответ

2

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

Примеры можно легко переписать, поэтому вам больше не нужно использовать ref.

public void DoAutoScrollReverse(Rectangle rectangle, int xPosition, int yPosition, 
ref int deltaX, ref int deltaY) 
{ 
} 

Создать небольшой класс:

public class Delta 
{ 
    int X { get; set; } 
    int Y { get; set; } 
} 

Без исх:

public Delta DoAutoScrollReverse(Rectangle rectangle, int xPosition, int yPosition) 
{ 
    return new Delta(deltaX, deltaY); 
} 

Теперь также более ясно, что вы возвращаете что-то и , что вы возвращаете.

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