CA1806:不要忽略方法的結果
型別名稱 |
DoNotIgnoreMethodResults |
CheckId |
CA1806 |
分類 |
Microsoft.Usage |
中斷變更 |
不中斷 |
原因
有許多的可能原因會導致發生這個警告:
建立從未使用的新物件。
呼叫建立與傳回新字串的方法,並且從未使用新字串。
傳回從未使用之 HRESULT 或錯誤碼的 COM 或 P/Invoke 方法。規則描述
未使用之物件的不必要物件建立及關聯的記憶體回收會降低效能。
字串是不變的,且 String.ToUpper 這類方法會傳回字串的新執行個體,而非修改呼叫方法中字串的執行個體。
忽略 HRESULT 或錯誤碼,可能導致錯誤情況或資源不足情況的非預期行為。
如何修正違規
如果方法 A 建立 B 物件的新執行個體,但是從未使用,請將執行個體當做引數傳遞至其他方法,或將執行個體指派至變數。如果不需要建立物件,請移除它。-或-
如果方法 A 會呼叫方法 B,但不會使用方法 B 傳回的新字串執行個體,請將執行個體當做引數傳遞至另一個方法,指派執行個體給變數,或是移除呼叫 (如果不需要的話)。
-或-
如果方法 A 會呼叫方法 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();
}
};
}