2016-04-21 3 views
8

У меня есть метод расширения, который возвращает значение. В этом случае следует установить определенный бит в байте:Можно ли получить предупреждение, если возвращаемое значение не используется?

public static byte SetBit(this byte b, int bitNumber, bool value) 
{ 
    if (value) 
    { 
     return (byte)(b | (1 << bitNumber)); 
    } 
    return (byte)(b & ~(1 << bitNumber)); 
} 

Возвращаемое значение должно быть присвоена переменной снова, потому что я не могу совмещать this и ref:

byte myByte = 3; 
myByte = myByte.SetBit(1, false); 

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

Для String.Replace, Resharper?/VisualStudio? предупреждает меня, что Возвращаемое значение чистого метода не используется:

String

ли это возможно для моего метода в некотором роде?

+0

«Возвращаемое значение нужно снова присвоить переменной, потому что я не могу объединить это и ref« Действительно? Я просто попытался, и он отлично работал ... –

+0

'ref this byte b' не будет компилироваться для меня @KirkWoll –

+1

В качестве альтернативы напишите [Roslyn Analyzer] (https://github.com/dotnet/roslyn/wiki/ How-To-Write-aC% 23-Analyzer-and-Code-Fix) - это отличный способ обеспечить соблюдение определенных шаблонов для вашей кодовой базы. Вы даже можете написать его, чтобы он был встроен в ваше решение - отлично подходит для проектов, ориентированных на компанию. –

ответ

4

Там, кажется, быть NuGet Пакет для Resharper Annotations

Это включает в себя MustUseReturnValueAttribute

[MustUseReturnValue("Use the return value to...")] 
public byte Foo() 
{  
} 

Как @Kirk Волл отметил в комментариях, также можно написать собственный Roslyn Analyzer

+1

Собирался публиковать похожие, но проверял его и [он работает] (http://i.stack.imgur.com/EY7nt.png) точно так, как описано. (Я использовал '[Pure]', а не '[MustUseReturnValue]', но я полагаю, что они работают одинаково) –

+2

'[Pure]' и '[MustUseReturnValue]' очень похожи по сути. '[MustUseReturnValue]' позволяет указать пользовательское сообщение, но кроме этого основное различие является семантическим. '[Pure]' означает, что метод не вносит изменений в состояние объекта (поэтому единственной причиной его вызова является возвращаемое значение). '[MustUseReturnValue]' также означает, что возвращаемое значение важно и должно использоваться, но не гарантирует гарантии состояния объекта. – citizenmatt

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