1. 概要
「CAxxxx」は、構文の記述方法や定義についての警告のようです。
2. CA1416
下記のようなメッセージが表示されます。
この呼び出しサイトはすべてのプラットフォームで到達可能です。'Public Overrides Property Text As String' は 'windows' 6.1 以降 でのみサポートされています。 (https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca1416)
これは、構成マネージャでプラットフォームを「AnyCPU」にしているとき、「Windows」以外のプラットフォームでは、無効であるため、発生するもののようであります。
「C#」の場合は、それが発生するメソッドの定義の前に。
[SupportedOSPlatform("windows")]
public object SomMethod(string source)
のように、上に「SupportedOSPlatform」という定義をすればよいらしい。
実際に発生したのは、「VB」でしたが、「VB」の場合は、下記のような記述になります。
<SupportedOSPlatform("windows")>
Public Property SomeProperty() As String
3. CA1822
下記のようなメッセージが表示されます。
メンバー 'someMethod' はインスタンス データにアクセスしないため、static にマークできます
下記のような構文で発生します。
public class Class5
{
public void someMethod()
{
}
}
定義に「static」をつけることで解消します。
public static void someMethod()
4. CA1829
下記のようなメッセージが表示されます。
Enumerable.Count() の代わりに "Count" プロパティを使用してください
下記のような構文で発生します。
List intList = new List();
intList.Add(1);
intList.Add(2);
Console.WriteLine(intList.Count());
「Count()」メソッドを使用するより、「Count」もしくは「Length」プロパティを使用する方が、効率的なため、より効率的なものを提案してくれています。
提案どおりに変更することで、解消します。
Console.WriteLine(intList.Count);
5. CA1847
下記のようなメッセージが表示されます。
単一の文字を検索する場合には 'string.Contains(char)' ではなく、'string' を使用します。
「string()」の検索対象が、文字列でなく、単一の文字の場合は、ダブルクォーテーションでなく、シングルクォーテーションを使った方が効率がよいですよ、と言っています。
メッセージの出し方が変ですね。
下記のような構文で発生します。
public static bool ContainsLetterI(string s)
{
return s.Contains("a");
}
いうとおりにすることで、解消します。
return s.Contains('a');
6. CA1854
下記のようなメッセージが表示されます。
二重参照を回避するには、'ContainsKey' チェックによって保護された Dictionary インデクサー アクセスよりも 'TryGetValue' 呼び出しを優先します
下記のような構文で発生します。
public string? GetValue(string key)
{
if (_dictionary.ContainsKey(key))
{
return _dictionary[key];
}
return null;
}
参考サイトの説明によれば。
規則の説明
IDictionary の要素がアクセスされたとき、インデクサー実装によって、IDictionary.ContainsKey メソッドが呼び出され、null 値がないか確認されます。 IDictionary.ContainsKey 句で if も呼び出し、値参照を保護する場合、1 つだけ必要なとき、2 つの参照が実行されます。
違反の修正方法
IDictionary.ContainsKey 呼び出しと要素のアクセスを IDictionary.TryGetValue メソッドの呼び出しで置換します。
ちゅうことで、「ContainsKey()」の代わりに「TryGetValue()」を使用することで解消します。
if (_dictionary.TryGetValue(key, out string? value))
7. 参考サイト
本ページは、下記のサイトおよび「Google」大先生を参考にさせていただきました。
「C# OleDb CA1416 の警告をクリアする (visual studio) 」
「CA1854: 'IDictionary.TryGetValue(TKey, out TValue)' メソッドを優先する」