Не игнорируйте результаты метода
Обновлен: Ноябрь 2007
TypeName |
DoNotIgnoreMethodResults |
CheckId |
CA1806 |
Категория |
Microsoft.Usage |
Критическое изменение |
Не критическое |
Причина
Создается новый объект, который нигде не используется.
либо
Вызывается метод, который создает и возвращает новую строку, однако эта строка нигде не используется.
либо
Метод COM или P/Invoke возвращает значение HRESULT или код ошибки, который нигде не используется.
Описание правила
Данное правило позволяет обнаруживать перечисленные ниже ситуации, когда они появляются в коде.
Ненужное создание объекта и связанная с ним сборка мусора для неиспользуемого объекта понижает производительность.
Строки являются неизменяемыми. Такие методы, как ToUpper, возвращают новый экземпляр строки, но не изменяют экземпляр строки в вызывающем методе.
Пропуск значения HRESULT или кода ошибки может привести к непредвиденному поведению в состоянии ошибки или к нехватке ресурсов.
Предотвращение нарушений
Если метод А создает новый экземпляр объекта В, который никогда не используется, передайте этот экземпляр в качестве аргумента другому методу или присвойте экземпляр переменной. Если создание объекта не требуется, удалите его.
либо
Метод A вызывает метод B, однако не использует новый экземпляр строки, возвращаемый методом B. Передайте этот экземпляр в качестве аргумента другому методу, присвойте экземпляр переменной или удалите вызов, если он не нужен.
либо
Метод A вызывает метод B, однако не использует значение HRESULT или код ошибки, возвращаемый методом B. Используйте результат в условном операторе, присвойте результат переменной или передайте его в качестве аргумента другому методу.
Отключение предупреждений
Предупреждения о нарушении данного правила можно отключить только в том случае, если создание объекта необходимо для какой-либо цели.
Пример
В следующем примере показан класс, не использующий результат вызова метода Trim.
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; }
}
};
}
В следующем примере предыдущее нарушение устраняется посредством присвоения результата метода Trim переменной, для которой он вызывался.
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; }
}
};
}
В следующем примере показан метод, который не использует создаваемый им объект.
![]() |
---|
Это нарушение нельзя воспроизвести в Visual Basic. |
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();
}
};
}
В следующем примере показан метод, который не использует код ошибки, возвращаемый неуправляемым методом GetShortPathName.
Imports System
Imports System.ComponentModel
Imports System.IO
Imports System.Runtime.InteropServices
Imports System.Text
Namespace Samples
Public Module FileIO
Public Function GetShortPath(ByVal longPath As String) As String
longPath = Path.GetFullPath(longPath)
Const MAX_PATH As Integer = 260
Dim shortPathBuffer As New StringBuilder(MAX_PATH)
' Violates this rule
NativeMethods.GetShortPathName(longPath, shortPathBuffer, shortPathBuffer.Capacity)
Return shortPathBuffer.ToString()
End Function
End Module
Friend Module NativeMethods
<DllImport("kernel32.dll", CharSet:=CharSet.Auto, SetLastError:=True, BestFitMapping:=False, ThrowOnUnmappableChar:=True)> _
Public Function GetShortPathName(ByVal lpszLongPath As String, ByVal lpszShortPath As StringBuilder, ByVal cchBuffer As UInteger) As UInteger
End Function
End Module
End Namespace
using System;
using System.ComponentModel;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
namespace Samples
{
public static class FileIO
{
public static string GetShortPath(string longPath)
{
longPath = Path.GetFullPath(longPath);
const int MAX_PATH = 260;
StringBuilder shortPathBuffer = new StringBuilder(MAX_PATH);
// Violates this rule
NativeMethods.GetShortPathName(longPath, shortPathBuffer, (uint)shortPathBuffer.Capacity);
return shortPathBuffer.ToString();
}
}
internal static class NativeMethods
{
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true, BestFitMapping = false, ThrowOnUnmappableChar = true)]
public static extern uint GetShortPathName(string lpszLongPath, StringBuilder lpszShortPath, uint cchBuffer);
}
}
#include "stdafx.h"
using namespace System;
using namespace System::ComponentModel;
using namespace System::IO;
using namespace System::Runtime::InteropServices;
using namespace System::Text;
namespace Samples
{
private ref class NativeMethods sealed
{
private:
NativeMethods()
{
}
internal:
[DllImport("kernel32.dll", CharSet=CharSet::Auto, SetLastError=true, BestFitMapping=false, ThrowOnUnmappableChar=true)]
static unsigned int GetShortPathName(String^ lpszLongPath, StringBuilder^ lpszShortPath, unsigned int cchBuffer);
};
public ref class FileIO sealed
{
private:
FileIO()
{
}
public:
static String^ GetShortPath(String^ longPath)
{
longPath = Path::GetFullPath(longPath);
const int MAX_PATH = 260;
StringBuilder^ shortPathBuffer = gcnew StringBuilder(MAX_PATH);
// Violates this rule
NativeMethods::GetShortPathName(longPath, shortPathBuffer, shortPathBuffer->Capacity);
return shortPathBuffer->ToString();
}
};
}
В следующем примере предыдущее нарушение устраняется посредством проверки кода ошибки и создания исключения при сбое вызова.
Namespace Samples
Public Module FileIO_1
Public Function GetShortPath(ByVal longPath As String) As String
longPath = Path.GetFullPath(longPath)
Const MAX_PATH As Integer = 260
Dim shortPathBuffer As New StringBuilder(MAX_PATH)
' GetShortPathName returns 0 when the operation fails
If NativeMethods.GetShortPathName(longPath, shortPathBuffer, shortPathBuffer.Capacity) = 0 Then
' Note: The constructor of Win32Exception will automatically
' set Win32Exception.NativeErrorCode to Marshal.GetLastWin32Error()
Throw New Win32Exception()
End If
Return shortPathBuffer.ToString()
End Function
End Module
Friend Module NativeMethods_1
<DllImport("kernel32.dll", CharSet:=CharSet.Auto, SetLastError:=True, BestFitMapping:=False, ThrowOnUnmappableChar:=True)> _
Public Function GetShortPathName(ByVal lpszLongPath As String, ByVal lpszShortPath As StringBuilder, ByVal cchBuffer As UInteger) As UInteger
End Function
End Module
End Namespace
namespace Samples
{
public static class FileIO_1
{
public static string GetShortPath(string longPath)
{
const int MAX_PATH = 260;
StringBuilder shortPathBuffer = new StringBuilder(MAX_PATH);
// GetShortPathName returns 0 when the operation fails
if (NativeMethods.GetShortPathName(longPath, shortPathBuffer, (uint)shortPathBuffer.Capacity) == 0)
{
// Note: The constructor of Win32Exception will automatically
// set Win32Exception.NativeErrorCode to Marshal.GetLastWin32Error()
throw new Win32Exception();
}
return shortPathBuffer.ToString();
}
}
internal static class NativeMethods_1
{
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true, BestFitMapping = false, ThrowOnUnmappableChar = true)]
public static extern uint GetShortPathName(string lpszLongPath, StringBuilder lpszShortPath, uint cchBuffer);
}
}
#include "stdafx.h"
using namespace System;
using namespace System::ComponentModel;
using namespace System::IO;
using namespace System::Runtime::InteropServices;
using namespace System::Text;
namespace Samples
{
private ref class NativeMethods_1 sealed
{
private:
void NativeMethods()
{
}
internal:
[DllImport("kernel32.dll", CharSet=CharSet::Auto, SetLastError=true, BestFitMapping=false, ThrowOnUnmappableChar=true)]
static unsigned int GetShortPathName(String^ lpszLongPath, StringBuilder^ lpszShortPath, unsigned int cchBuffer);
};
public ref class FileIO_1 sealed
{
private:
void FileIO()
{
}
public:
static String^ GetShortPath(String^ longPath)
{
longPath = Path::GetFullPath(longPath);
const int MAX_PATH = 260;
StringBuilder^ shortPathBuffer = gcnew StringBuilder(MAX_PATH);
// GetShortPathName returns 0 when the operation fails
if (NativeMethods::GetShortPathName(longPath, shortPathBuffer, shortPathBuffer->Capacity) == 0)
{
// Note: The constructor of Win32Exception will automatically
// set Win32Exception.NativeErrorCode to Marshal.GetLastWin32Error()
throw gcnew Win32Exception();
}
return shortPathBuffer->ToString();
}
};
}