CA1806: Methodenergebnisse nicht ignorieren
TypeName |
DoNotIgnoreMethodResults |
CheckId |
CA1806 |
Kategorie |
Microsoft.Usage |
Unterbrechende Änderung |
Nicht unterbrechend |
Ursache
Diese Warnung kann unterschiedliche Gründe haben:
Es wurde ein neues Objekt erstellt, jedoch nie verwendet.
Es wird eine Methode aufgerufen, die eine neue Zeichenfolge erstellt und zurückgibt, allerdings wird die neue Zeichenfolge nie verwendet.
Eine COM- oder P/Invoke-Methode, die ein HRESULT oder einen Fehlercode zurückgibt, das oder der nie verwendet wird. Regelbeschreibung
Die unnötige Objekterstellung und die zugeordnete Garbage Collection des nicht verwendeten Objekts beeinträchtigen die Leistung.
Zeichenfolgen sind nicht veränderlich, und bestimmte Methoden, z. B. String.ToUpper, geben eine neue Instanz einer Zeichenfolge zurück, statt die Instanz der Zeichenfolge in der aufrufenden Methode zu ändern.
Wenn HRESULT oder der Fehlercode ignoriert werden, kann dies zu unerwartetem Verhalten in Fehlerbedingungen oder Situationen führen, in denen nur geringe Ressourcen verfügbar sind.
Behandeln von Verstößen
Wenn Methode A eine neue Instanz von Objekt B erstellt, das nie verwendet wird, übergeben Sie die Instanz als Argument an eine andere Methode, oder weisen Sie die Instanz einer Variablen zu. Wenn die Objekterstellung nicht erforderlich ist, entfernen Sie das it. – oder –
Wenn die Methode A Methode B aufruft, jedoch nicht die neue, von Methode B zurückgegebene Zeichenfolgeninstanz verwendet. Übergeben Sie die Instanz als Argument an eine andere Methode, weisen Sie die Instanz einer Variablen zu. Wenn der Aufruf nicht erforderlich ist, können Sie diesen auch entfernen.
– oder –
Wenn Methode A Methode B aufruft, jedoch nicht das HRESULT oder den Fehlercode verwendet, das oder der von der Methode zurückgegeben wird. Verwenden Sie das Ergebnis in einer Bedingungsanweisung, weisen Sie das Ergebnis einer Variablen zu, oder übergeben Sie es als ein Argument an eine andere Methode.
Wann sollten Warnungen unterdrückt werden?
Unterdrücken Sie keine Warnung dieser Regel, es sei denn, mit der Objekterstellung wird ein bestimmter Zweck verfolgt.
Beispiel
Das folgende Beispiel zeigt eine Klasse, die das Ergebnis des Aufrufs von String.Trim ignoriert.
Im folgenden Beispiel wird der vorherige Verstoß korrigiert, indem das Ergebnis von String.Trim der Variablen, für die die Methode aufgerufen wurde, erneut zugeordnet wird.
Im folgenden Beispiel wird eine Methode veranschaulicht, die kein von ihr erstelltes Objekt verwendet.
Tipp
Dieser Verstoß kann nicht in Visual Basic reproduziert werden.
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; }
}
};
}
Im folgenden Beispiel wird der vorherige Verstoß korrigiert, indem die unnötige Erstellung eines Objekts entfernt wird.
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; }
}
};
}
Das folgende Beispiel zeigt eine Methode, die den von der systemeigenen GetShortPathName-Methode zurückgegebenen Fehlercode ignoriert.
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();
}
};
}
Im folgenden Beispiel wird der vorherige Verstoß korrigiert, indem der Fehlercode überprüft wird und eine Ausnahme ausgelöst wird, wenn der Aufruf fehlschlägt.
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();
}
};
}