はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【ReShaper】コードアノテーション属性の「UsedImplicitly」でRider(ReShaper)にメソッドが使用されることをマークする

はじめに

Rider(ReShaper)は、利用されていないメソッド等に対してはコメントを表示してくれます。(自身で警告にしたりと設定可能)

Riderがメソッド未使用を教えてくれている様子

ただリフレクションや外部ライブラリから利用されるので、検出の対象外にしてほしいケースが多々あります。そんな場合に活用できるのは今回紹介するUsedImplicitlyになります。

概要

[UsedImplicitly]を用いることで、ReShaperにこのメソッドは利用されると認識させることができ、検出の対象外にしてくれます。
www.nuget.org

マークされたシンボルが暗黙的に (リフレクション経由、外部ライブラリなどで) 使用されることを示します。そのため、このシンボルは使用箇所チェックインスペクションによって無視されます。
ImplicitUseKindFlags および ImplicitUseTargetFlags を使用して、この属性の適用方法を構成できます。

https://pleiades.io/help/rider/Reference__Code_Annotation_Attributes.html#UsedImplicitlyAttribute

[UsedImplicitly]
public static void SomeMethod()
{
        
}
UsedImplicitlyを付与することで表示が変わる

内部実装

[AttributeUsage(AttributeTargets.All)]
[Conditional("JETBRAINS_ANNOTATIONS")]
public sealed class UsedImplicitlyAttribute : Attribute
{
    public UsedImplicitlyAttribute()
        : this(ImplicitUseKindFlags.Default, ImplicitUseTargetFlags.Default) { }

    public UsedImplicitlyAttribute(ImplicitUseKindFlags useKindFlags)
        : this(useKindFlags, ImplicitUseTargetFlags.Default) { }

    public UsedImplicitlyAttribute(ImplicitUseTargetFlags targetFlags)
        : this(ImplicitUseKindFlags.Default, targetFlags) { }

    public UsedImplicitlyAttribute(ImplicitUseKindFlags useKindFlags, ImplicitUseTargetFlags targetFlags)
    {
        UseKindFlags = useKindFlags;
        TargetFlags = targetFlags;
    }

    public ImplicitUseKindFlags UseKindFlags { get; }

    public ImplicitUseTargetFlags TargetFlags { get; }

    public string Reason { get; set; }
}

JetBrains.Annotations/src/Annotations.cs at 920d4da1898504a9211fa8cde144178aa4230512 · JetBrains/JetBrains.Annotations · GitHub

あとがき

ちゃんとチェックしてないのですが、別に[UsedImplicitly]を付与したとしてもコードストリッピングされなくなるわけではないはずです。(あくまでReshaperでの警告を抑制してくれる)

そこは注意してください。