QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

Region どう使えば便利なんでしょう??

いつも拝見させていただいております。

早速ですが、.NETの #Region の機能、これを
日ごろから活用されている方、こんな風に使うと便利だよ〜っていう
使い方を教えてください。
(VB.NETしか使ったことないので、C#だと表記方法が違うかもしれないです…
 無知ですいません)

私はほとんど使っていません。。。。
というか、有効な使い方が判らないと言ったほうが正確です…
きっと、目からウロコ的な使い方をしてらっしゃる方がいるのではないでしょうか。

よろしくお願い致します

質問者:ハルシオン

回答

早速ですが、.NETの #Region の機能、これを

日ごろから活用されている方、こんな風に使うと便利だよ〜っていう

使い方を教えてください。

以下を region で括っています。

・列挙体定義
・デリゲート定義
・イベント定義
・インターフェース定義
・構造体定義
・クラス定義
・フィールド
・プロパティ
・構築
・廃棄
・実装
・操作
・オーバーライド
・xxx メンバ
・イベントハンドラ

MFC の影響が少し残ってるのかな?

# 「イベントハンドラ」を追記。

[ メッセージ編集済み 編集者: 渋木宏明(ひどり) 編集日時 2005-12-14 08:42 ]

投稿者:渋木宏明(ひどり)

編集 履歴 (0)

ひどりさんに付け足しになりますが、プロパティを #region で括る場合は、
プロパティ変数とプロパティ定義をひとまとめにして括っています。
(変数は使う直前に定義/宣言することを考えると自然だと思います)




\#Region " Code プロパティ "

    Private _Code As Integer

    Public Property Code() As Integer
        Get
            Return _Code
        End Get

        Set
            _Code = Value
        End Set
    End Property

\#End Region

実際には、以下のリンクのような感じです。

  JavaScript で #Region を再現するテストページ

_________________C# と VB.NET の入門サイト
じゃんぬねっと日誌

投稿者:じゃんぬねっと

編集 履歴 (0)

ひどりさんに付け足しになりますが、プロパティを #region で括る場合は、

プロパティ変数とプロパティ定義をひとまとめにして括っています。

プロパティ1個とかメソッド1個の単位で括るのは挫折しました (^^;

IDE のエディタが、#region のネストをもっと上手に扱ってくれるようになったら戻るかも。

_________________// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/

投稿者:渋木宏明(ひどり)

編集 履歴 (0)

渋木宏明(ひどり)さんの書き込み (2005-12-14 08:45) より:

プロパティ1個とかメソッド1個の単位で括るのは挫折しました (^^;

IDE のエディタが、#region のネストをもっと上手に扱ってくれるようになったら戻るかも。

ひどりさんのこの気持ち、すごく判ります。(^^;)
VB はインデントなしの状態で括られますし、
C# はインデントが同一レベルで括られてしまいますよね。
そのおかげで、返って見にくくなることもしばしばあります。

実際には、C# でも VB でも #region でインデントを、2 スペース取るようにしています。
ただ、C# は #endregion の時点で勝手に補正されちゃうので、結構イライラします。
(再フォーマットを完全に無効にできないです)




[C#]
public class TClass {

  #region Method1 メソッド 

    private void Method1() {

    }

  #endregion

}



[VB]
Public Class TClass1

  #Region " Method1 メソッド "

    Private Sub Method1()

    End Sub

  #End Region

End Class

ただし、これはメソッドとプロパティに限った話で、
プライベートなフィールドや定数などは、ひとまとめで括ります。

_________________C# と VB.NET の入門サイト
じゃんぬねっと日誌

投稿者:じゃんぬねっと

編集 履歴 (0)

私の場合クラス定義の内部で以下の項目を大枠としてRegionを適用します。

コンストラクタ
フィールド
プロパティ
メソッド
イベントハンドラ
内部クラス
インターフェース実装

そして上記の項目に対し必要であれば詳細な区分けを行いますが、大抵はメソッドとイベントハンドラのみネストしたRegionを記述します。以前は、publicやoverrideのような修飾子別の区分けをしていたのですが最近は機能単位での区分けを行ったほうが分かりやすいかなと思ってます(初期化コード、データ操作コードなど)。

渋木宏明(ひどり)さん:

プロパティ1個とかメソッド1個の単位で括るのは挫折しました (^^;
IDE のエディタが、#region のネストをもっと上手に扱ってくれるようになったら戻るか
も。
 Eclipseのフォールディングみたいな機能がVisual Studioに追加されると嬉しいかもですね。

投稿者:スープカレー

編集 履歴 (0)

そういえば、C# ではメソッド内などでも、#region ディレクティブが使えますよね。
私は使ったことがありませんが、使われている方はいらっしゃいますか?

私の場合、まとめるくらいならメソッドにしちゃいます。(^^;)
構造化言語からの基本がそういうものですし、コメントも簡素化できますからね。

最初、スレッド タイトルを見た時、System.Drawing.Region クラスのことかと思いました。
「#Region ディレクティブ」とした方が良いかもしれませんね。

_________________C# と VB.NET の入門サイト
じゃんぬねっと日誌

投稿者:じゃんぬねっと

編集 履歴 (0)

じゃんぬねっとさんの書き込み (2005-12-14 09:52) より:

そういえば、C# ではメソッド内などでも、#region ディレクティブが使えますよね。

私は使ったことがありませんが、使われている方はいらっしゃいますか?

私の場合、まとめるくらいならメソッドにしちゃいます。(^^
構造化言語からの基本がそういうものですし、コメントも簡素化できますからね。

私の勤務先にこれやっちゃう人がいます(しかもこの方以前に構造化言語のなんたるかを語っていたような気が...)。じゃんぬねっとさんの言われるとおりのつっこみがバシバシと行われていますね(^^)。こんなのやる人がいるくらいだから規約にRegionの利用法もあったほうがいいかなと思ったりします(標準コーディング規約にはあまり厳密なものがなかった気がするので)。

投稿者:スープカレー

編集 履歴 (0)

私は

コンストラクタ・デストラクタ
プロパティ
メソッド
オーバーライド(メソッドの)
イベントハンドラ
タイプ

のregionを作ります。

投稿者:一郎

編集 履歴 (0)

僕は今まで使ったことがなかったんですが、皆さんの使い方を読んで、これを機に使ってみようと思いました。




+コンストラクタ

+日付プロパティ

\#region "入力された値は正しい"
    public function 入力された値は正しい(byval 値 as string) as boolean
        return (数値だ() & 桁数が8文字以内だ())
    end funciton

    Private Function 数値だ(ByVal 文字列 As String) As Boolean
        Dim meta As String = "^-?[0-9]*\.?[0-9]+$"
        Dim regex As New System.Text.RegularExpressions.Regex(meta)
        Dim m As System.Text.RegularExpressions.Match = regex.Match(文字列)
        Return m.Success
    End Function

    Private Function 桁数が8文字以内だ(ByBal 文字列 as string) as Boolean
        return (文字列.Length <= <img src="/bbs/phpBB/images/smiles/icon_cool.gif">
    End Function
\#end region

のように、公開メソッド「入力された値は正しい」を読みやすくするための下請けルーチン「数値だ」と「桁数が8文字以内だ」を括ってしまうと整理されて便利だと思ったのですがどうでしょうか。

投稿者:R・田中一郎

編集 履歴 (0)

R・田中一郎さんの書き込み (2005-12-14 14:31) より:

公開メソッド「入力された値は正しい」を読みやすくするための下請けルーチン「数値だ」と「桁数が8文字以内だ」を括ってしまうと整理されて便利だと思ったのですがどうでしょうか。

私は、そのメソッドの中でしか使わないメソッドは
親メソッド名_名称()
という名前を付けています。例えばGetItems()で使うメソッドは
GetItems_MakeOneLine()
というような感じ。#regionは使わないですね。
#regionを使いすぎるとソースにたどり着くのが面倒になりますから。

投稿者:一郎

編集 履歴 (0)

この例の場合は静的メソッドが望ましいので、
静的メソッドにして、非公開部分は別枠でまとめます。
インスタンス メソッドの場合は、R・田中一郎 さんのようにまとめることがあります。

インナークラス何かもまとめることはありますね。
ただし、#region ディレクティブは、3 回以上ネストしないようにしています。

_________________C# と VB.NET の入門サイト
じゃんぬねっと日誌

投稿者:じゃんぬねっと

編集 履歴 (0)

じゃんぬねっとさんの書き込み (2005-12-14 09:52) より:

そういえば、C# ではメソッド内などでも、#region ディレクティブが使えますよね。

私は使ったことがありませんが、使われている方はいらっしゃいますか?

私の場合、まとめるくらいならメソッドにしちゃいます。(^^
構造化言語からの基本がそういうものですし、コメントも簡素化できますからね。

私は、あまり#regionディレクティブ自体を使わない方ですが、
メソッド内で使う事があります。
どういう時かというと、

・事前条件
・事後条件

のチェックをしているブロックで括るようにしています。

投稿者:NAL-6295

編集 履歴 (0)

クラスの最初で宣言されている変数の塊や、コンストラクタとDisposeはまとめて#regionで囲んでしまいます。たくさんスクロールするのが嫌なんで(^^;

いつも思うんですが、PDFリーダーみたいに、左のペインにregion一覧を出してくれて、そこをクリックしたら目的のregionにジャンプするとうれしいなぁと個人的には思います。

投稿者:trapemiya

編集 履歴 (0)

皆様、色々と使ってらっしゃるんですね!
早速真似して使わせていただきます。

じゃんぬねっとさんの書き込み (2005-12-14 09:52) より:

最初、スレッド タイトルを見た時、System.Drawing.Region クラスのことかと思いました。

「#Region ディレクティブ」とした方が良いかもしれませんね。

↑「#Region ディレクティブ」が正しい呼称だったんですね。ありがとうございます。。

確かに、画面のスクロールが長くなるとうっとしいですし、プロパティやコンストラクタなど、一度作ってしまって、その後あまりいじる必要のない(というかイジられたくない)部分は#Regionで囲んでしまったほうがスッキリしますね!!

イベントハンドラで使用する場合はそれに関連するメソッドも一緒に#Regionの中に含めてしまったほうがよいのでしょうか。。。
あくまで、イベントだけのほうが、ベターでしょうか。

[ メッセージ編集済み 編集者: ハルシオン 編集日時 2005-12-14 18:21 ]

投稿者:ハルシオン

編集 履歴 (0)

trapemiyaさんの書き込み (2005-12-14 16:50) より:

いつも思うんですが、PDFリーダーみたいに、左のペインにregion一覧を出してくれて、そこをクリックしたら目的のregionにジャンプするとうれしいなぁと個人的には思います。

クラス ビューがあるので、不要と判断されている可能性がありますよ。(^^)

ハルシオンさんの書き込み (2005-12-14 18:19) より:

イベントハンドラで使用する場合はそれに関連するメソッドも一緒に#Regionの中に含めてしまったほうがよいのでしょうか。。。

あくまで、イベントだけのほうが、ベターでしょうか。

時と場合と人によるかもしれませんね。
#region ディレクティブをどの目的に使うのか、ですよね。
ある小規模な機能をまとめるために用いるのであれば有効なのでしょう。

私はイベントとメソッドは分ける人ですが。

_________________C# と VB.NET の入門サイト
じゃんぬねっと日誌

投稿者:じゃんぬねっと

編集 履歴 (0)

ハルシオンさんの書き込み (2005-12-14 18:19) より:

イベントハンドラで使用する場合はそれに関連するメソッドも一緒に#Regionの中に含めてしまったほうがよいのでしょうか。。。

イベントハンドラは、まとまっている方が読みやすいので、イベントハンドラばっかりで固めています。
そして、出来る限り少ない行数にして、後はメソッドを別途作ってます。

そのメソッドが読みにくくなるなら、その時点で #region ディレクティブ を用いることになると思います。

投稿者:R・田中一郎

編集 履歴 (0)

今気づいたんですが、#region ディレクティブ ってインデントできないんですか?
こんな感じになっちゃって何かイヤです。



+    Public ReadOnly Property 日付...

+    Public Property 金額...

+氏名

+    Public Property 品名...

だからって、全部に #Region 書くの嫌だ・・・

投稿者:R・田中一郎

編集 履歴 (0)

R・田中一郎さんの書き込み (2005-12-14 19:25) より:

今気づいたんですが、#region ディレクティブ ってインデントできないんですか?

こんな感じになっちゃって何かイヤです。

先の私の投稿をご覧ください。

_________________C# と VB.NET の入門サイト
じゃんぬねっと日誌

投稿者:じゃんぬねっと

編集 履歴 (0)

じゃんぬねっとさんの書き込み (2005-12-14 09:34) より:

VB はインデントなしの状態で括られますし、

C# はインデントが同一レベルで括られてしまいますよね。

そのおかげで、返って見にくくなることもしばしばあります。

この部分は、既読してまして、実は気になっていたんですが、

実際には、C# でも VB でも #region でインデントを、2 スペース取るようにしています。

ただ、C# は #endregion の時点で勝手に補正されちゃうので、結構イライラします。

(再フォーマットを完全に無効にできないです)

と書いてあったので、何かすればインデントできるんじゃないかと思っていたのです。
でも、できませんでした。

投稿者:R・田中一郎

編集 履歴 (0)

R・田中一郎さんの書き込み (2005-12-15 09:05) より:

と書いてあったので、何かすればインデントできるんじゃないかと思っていたのです。

でも、できませんでした。

先に書いたように、

(再フォーマットを完全に無効にできないです)

つまり再フォーマットされたら手動でインデントつけるしかないですね。

_________________C# と VB.NET の入門サイト
じゃんぬねっと日誌

投稿者:じゃんぬねっと

編集 履歴 (0)

先ほど発見したのですが、




+    Public ReadOnly Property 日付...

+    Public Property 金額...

-#Region "    氏名"
     :
   だらだら
   だらだら
     :
 #End Region

+    Public Property 品名...


このように、書くと何とか揃えることができますね。

じゃんぬねっとさんの書き込み (2005-12-15 10:43) より:

先に書いたように、

(再フォーマットを完全に無効にできないです)

つまり再フォーマットされたら手動でインデントつけるしかないですね。

もしかして、ここで言う「手動でインデント」って、これのことだったのですか?
僕が上記の書き方を発見した時は、「してやったり」感があったのですが、もしや皆さん普通に使っていたのでしょうか。
なかなかのテクニシャンですね。




+    Public ReadOnly Property 日付...

+    Public Property 金額...

+    Public Property 氏名...

+    Public Property 品名...


でも、こうやって揃えたいので、




-#region "    Public Property 氏名 ..."
     :
   だらだら
   だらだら
     :
 #End Region


わざわざ、こんな書き方をしてしまった...

投稿者:R・田中一郎

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。