CA1806: メソッドの結果を無視しない
TypeName |
DoNotIgnoreMethodResults |
CheckId |
CA1806 |
カテゴリ |
Microsoft.Usage |
互換性に影響する変更点 |
なし |
原因
この警告には複数の原因が考えられます。
新しいオブジェクトが作成されましたが、使用されていません。
新しい文字列を作成して返すメソッドが呼び出されましたが、新しい文字列が使用されていません。
COM メソッドまたは P/Invoke メソッドから返された HRESULT またはエラー コードが使用されていません。 規則の説明
不要なオブジェクトの作成や、使用されないオブジェクトに関連するガベージ コレクションは、パフォーマンスの低下を招きます。
文字列は変更できないので、String.ToUpper などのメソッドは、呼び出し元メソッドで文字列のインスタンスを変更するのではなく、文字列の新しいインスタンスを返します。
HRESULT またはエラー コードを無視すると、エラー状態で予期しない動作が発生したり、リソース不足状態になったりする可能性があります。
違反の修正方法
メソッド A でオブジェクト B の新しいインスタンスを作成し、そのインスタンスが使用されていない場合は、そのインスタンスを別のメソッドに引数として渡して、変数に代入します。 オブジェクトを作成する必要がなければ、そのコードを削除します。または
メソッド A でメソッド B を呼び出し、メソッド B から返された新しい文字列インスタンスを使用していない場合は、 そのインスタンスを別のメソッドに引数として渡して、変数に代入します。 または、必要なければ呼び出しを削除します。
または
メソッド A でメソッド B を呼び出し、メソッド B から返された HRESULT またはエラー コードを使用していない場合は、 その結果を条件付きステートメントで使用して、結果を変数に割り当てます。または、その結果を別のメソッドに引数として渡します。
警告を抑制する状況
オブジェクト作成の操作に何らかの目的がある場合を除いて、この規則による警告は抑制しないでください。
使用例
String.Trim を呼び出した結果を無視するクラスの例を次に示します。
String.Trim の結果を呼び出し元の変数に代入することによって前述の違反を修正するコード例を次に示します。
作成したオブジェクトを使用しないメソッドの例を次に示します。
注意
この違反は、Visual Basic では再現できません。
Imports System
Namespace Samples
Public Class Book
Private ReadOnly _Title As String
Public Sub New(ByVal title As String)
If title IsNot Nothing Then
' Violates this rule
title.Trim()
End If
_Title = title
End Sub
Public ReadOnly Property Title() As String
Get
Return _Title
End Get
End Property
End Class
End Namespace
using System;
namespace Samples
{
public class Book
{
private readonly string _Title;
public Book(string title)
{
if (title != null)
{
// Violates this rule
title.Trim();
}
_Title = title;
}
public string Title
{
get { return _Title; }
}
}
}
using namespace System;
namespace Samples
{
public ref class Book
{
private:
initonly String^ _Title;
public:
Book(String^ title)
{
if (title != nullptr)
{
// Violates this rule
title->Trim();
}
_Title = title;
}
property String^ Title
{
String^ get() { return _Title; }
}
};
}
オブジェクトの不要な作成を削除することによって上記の違反を修正するコード例を次に示します。
Imports System
Namespace Samples
Public Class Book
Private ReadOnly _Title As String
Public Sub New(ByVal title As String)
If title IsNot Nothing Then
title = title.Trim()
End If
_Title = title
End Sub
Public ReadOnly Property Title() As String
Get
Return _Title
End Get
End Property
End Class
End Namespace
using System;
namespace Samples
{
public class Book
{
private readonly string _Title;
public Book(string title)
{
if (title != null)
{
title = title.Trim();
}
_Title = title;
}
public string Title
{
get { return _Title; }
}
}
}
using namespace System;
namespace Samples
{
public ref class Book
{
private:
initonly String^ _Title;
public:
Book(String^ title)
{
if (title != nullptr)
{
title = title->Trim();
}
_Title = title;
}
property String^ Title
{
String^ get() { return _Title; }
}
};
}
GetShortPathName というネイティブ メソッドから返されたエラー コードを無視するメソッドの例を次に示します。
using System;
namespace Samples
{
public class Book
{
public Book()
{
}
public static Book CreateBook()
{
// Violates this rule
new Book();
return new Book();
}
}
}
using namespace System;
namespace Samples
{
public ref class Book
{
public:
Book()
{
}
static Book^ CreateBook()
{
// Violates this rule
gcnew Book();
return gcnew Book();
}
};
}
呼び出しに失敗したときに、エラー コードをチェックして例外をスローすることによって上記の違反を修正するコード例を次に示します。
using System;
namespace Samples
{
public class Book
{
public Book()
{
}
public static Book CreateBook()
{
return new Book();
}
}
}
using namespace System;
namespace Samples
{
public ref class Book
{
public:
Book()
{
}
static Book^ CreateBook()
{
return gcnew Book();
}
};
}