CA1806: Non ignorare i risultati dei metodi
TypeName |
DoNotIgnoreMethodResults |
CheckId |
CA1806 |
Category |
Microsoft.Usage |
Breaking Change |
Non sostanziale |
Causa
Le cause di questo avviso possono essere molteplici:
Viene creato un nuovo oggetto, ma non viene mai utilizzato.
Viene chiamato un metodo per la creazione e la restituzione di una nuova stringa e la nuova stringa non viene mai utilizzata.
Un metodo COM o P/Invoke che restituisce un codice di errore o HRESULT che non viene mai utilizzato. Descrizione della regola
La creazione di oggetti superflui e la Garbage Collection associata per l'oggetto non utilizzato influiscono negativamente sulle prestazioni.
Le stringhe non possono essere modificate e i metodi come String.ToUpper restituiscono una nuova istanza di una stringa anziché modificare l'istanza della stringa nel metodo chiamante.
Se si ignora il codice di errore o HRESULT si rischia di causare un comportamento imprevisto in caso di errore o una condizione di insufficienza delle risorse.
Come correggere le violazioni
Se con il metodo A viene creata una nuova istanza dell'oggetto B che non viene mai utilizzata, passare l'istanza come un argomento a un altro metodo o assegnare l'istanza a una variabile. Se la creazione dell'oggetto non è necessaria, rimuoverla. In alternativa
Se il metodo A chiama il metodo B, ma la nuova istanza della stringa restituita dal metodo B non viene utilizzata. Passare l'istanza come argomento a un altro metodo, assegnare l'istanza a una variabile oppure rimuovere la chiamata se non è necessaria.
In alternativa
Se il metodo A chiama il metodo B, ma il codice di errore o HRESULT restituito dal metodo non viene utilizzato. Utilizzare il risultato in un'istruzione condizionale, assegnare il risultato a una variabile o passarlo come argomento a un altro metodo.
Esclusione di avvisi
Non escludere un avviso da questa regola a meno che l'atto di creazione dell'oggetto non abbia uno scopo preciso.
Esempio
Nell'esempio seguente viene illustrata una classe che ignora il risultato della chiamata a String.Trim.
Nell'esempio seguente viene risolta la precedente violazione mediante l'assegnazione del risultato del metodo String.Trim alla variabile su cui era stata effettuata la chiamata.
Nell'esempio riportato di seguito viene illustrato un metodo che non utilizza un oggetto creato dal metodo stesso.
Nota
Questa violazione non può essere riprodotta in 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; }
}
};
}
Nell'esempio riportato di seguito viene risolta la precedente violazione mediante la rimozione della creazione non necessaria di un oggetto.
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; }
}
};
}
Nell'esempio seguente viene illustrato un metodo che ignora il codice di errore restituito dal metodo GetShortPathName nativo.
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();
}
};
}
Nell'esempio riportato di seguito viene risolta la precedente violazione mediante il controllo del codice di errore e la generazione di un'eccezione quando la chiamata ha esito negativo.
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();
}
};
}