Visual Studio 2022 - エラー・警告 - 警告 CAxxxx


クラウディア 


1. 概要
2. CA1416
3. CA1822
4. CA1829
5. CA1847
6. CA1854
7. 参考サイト

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)' メソッドを優先する

EaseUS
AbemaTV 無料体験
マイニングベース