2016-04-21 25 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)); 
} 

返回的值需要重新分配給一個變量,因爲我不能結合thisref

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

這是容易忘記意外的任務。有人會想,方法直接改變價值。

對於String.Replace,Resharper?/ VisualStudio?警告我,純法的返回值不使用

String

我以某種方式方法,這也可能嗎?

+0

「返回的值需要再次分配給一個變量,因爲我不能將這個和ref相結合」真的嗎?我剛剛嘗試過,它工作得很好... –

+0

'ref this byte b' will not compile for me @KirkWoll –

+1

或者,寫一個[Roslyn分析器](https://github.com/dotnet/roslyn/wiki/如何寫-Ac%23-分析器和代碼修復) - 這是爲你的代碼庫強制執行特定模式的好方法。您甚至可以編寫它,以便將其嵌入您的解決方案中 - 非常適合特定於公司的項目。 –

回答

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

相關問題