📇

[C#] 特定のプロパティ、メソッド等を、入力候補に上げない方法

2024/03/10に公開

使い方

属性 System.ComponentModel.EditorBrowsableAttribute を付けます。

/// <summary>
/// インテリセンスで表示されるとき、後ろのほうになるクラス
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(state: global::System.ComponentModel.EditorBrowsableState.Advanced)]
public class AdvancedClass {}

/// <summary>
/// インテリセンスで表示されなくなるクラス
/// </summary>
/// <remarks>
/// コンパイル時はアクセス修飾子に従うので、本当の意味で見えなくなるわけではありません
/// </remarks>
[global::System.ComponentModel.EditorBrowsableAttribute(state: global::System.ComponentModel.EditorBrowsableState.Never)]
public class NeverClass {}

クラスだけではなく、構造体(struct)、インターフェース(interface)、列挙体(enum)、
コンストラクター、プロパティ(get,set)、メンバー変数、メソッド、
デリゲート(delegete)、イベント(event)にもつけられます。

説明

インテリセンス (IntelliSense) とは

Visual Studio等のコードエディターで、入力中に候補として関連する文字列を挙げてくれる機能のことを指します。

類語として「コード補完 (Code completion)」、「コンテンツ アシスト (Content assist)」、「コードヒント (Code hinting)」があります。

System.ComponentModel.EditorBrowsableAttribute とは

この属性がついたクラス等について、インテリセンスでどのように表示するのか(あるいは、非表示にするのか)を指定します。

指定方法は System.ComponentModel.EditorBrowsableState で定義されており、3つあります。

  • Always: 常に参照されます。
  • Advanced: 高度なユーザー向けに参照されます。IDEの設定次第では非表示になります。
  • Never: 入力候補として上がりません。

以下筆者の気持ち

この属性は自分自身が書くためというより、他の人が書くための入力補助を行う意味が強いです。
特に、ライブラリ、フレームワークの開発者や、Unity上でAssembly Definition Files を使ってアセンブリを分けている場合に役立ちます。

使ってもいいけど、ちゃんと理解してから使って欲しいものには EditorBrowsableAttribute(EditorBrowsableState.Advanced)を付けます。

廃止予定のものや、構造上仕方なく public にしているものは EditorBrowsableAttribute(EditorBrowsableState.Never) を付けます。
※ 廃止予定だったら大抵 System.ObsoleteAttribute もつけるので、あんまり意味ないかも知れないです。
※ 構造上仕方なくつけるのは、本当は設計が良くないのです。かなしい。

参考

GitHubで編集を提案

Discussion