2009-09-24 7 views
6

C#のテキストパーサで作業しているときに、文字列の最初の行をかなり頻繁に削除する必要があることがわかりました。私はそれを行うための単純な関数をまとめましたが、PHPのバックグラウンドから来て、私はクラスの外に関数を定義することができないので、どこに置くべきか分かりません。 .NETでそれを行う習慣的な方法は何ですか?関数を格納する静的クラスを作成しますか?.NETプロジェクトでその他の機能はどこに置くべきですか?

+1

どのような種類の.NETプロジェクトですか? ASP.NET? ASP.NET MVC? WinForms? Silverlight? 「どこに置くか」の慣習は、プロジェクトのタイプによって異なります。 – Portman

+0

これはWinFormsになります。 –

答えて

18

はい、静的なヘルパークラスは、通常はこれを行う方法です。その拡張メソッド作るために

public static string RemoveFirstLine(this string s) { 
    ... 
} 

また、C#3に、あなたは次のようにメソッドを宣言することができます。メソッドが文字列型自体で宣言されているかのように、任意の文字列で呼び出すことができます。

+0

Butterflyの説明によれば、拡張メソッドは間違いなく道のりです。 – Bomlin

+0

うわー、拡張メソッドはきれいです!それが私が使い終わったものです。それらに言及してくれてありがとう。 –

20

私は一般的に、ヘルパーまたはユーティリティの静的クラスを作成し、そこに対応するヘルパー関数を配置します。

さらに、ヘルパとユーティリティのクラスを論理的にグループ化しています。オブジェクトの変換関数の横にテキスト解析関数を置くことは無意味です。この混乱は、TextUtilsクラスとConversionUtilsクラスでクリアされます。

+0

+1私にそれを打つ。 –

+6

このような関数の拡張メソッドを作ることで、おそらく恩恵を受けるでしょう。 –

2

通常、私はUtilitiesクラスを作成し、静的ヘルパーメソッドを定義します。

4

私はこれのための標準はないと思います。私はBlahUtilという静的クラスを作る傾向があります。あなたの例では、私はそれをStringUtilの静的メソッドにします。これにより、関連するメソッドを分かりやすい単位にグループ化し、それらを発見してチーム間で共有することが容易になります。

ます。また、その後(C#3.0以降)拡張メソッドとして公開されているこれらの方法のどれを選択することができます。

public static class StringUtil 
{ 
    public static string RemoveFirstLine(this string multiLineString) 
    { 
     // ... 
    } 
} 
0

私はそのような関数の静的なワーカークラスを作成したいと思います。そうでないかもしれない素敵な道が、物事はシンプルに保つ1 ...;)

K

0

文字列をextension methodを使用してください。それが彼らのためのものです。

+0

私は私の答えを書いている間にくそった! –

1

私は静的な "ヘルパー"クラスを実行しましたが、いくつかの分析の後に行いました。このタイプのヘルパー関数は、常に別個のクラスの実装として終わります。あなたの場合、 "基本的なテキストパーサー"クラスと、 "解析"メソッドをオーバーライドする派生クラスがあります。

0

静的メソッドを持つクラスを使用できます。 ParserUtils.RemoveFirstLine()のようなものです。 .NET 3.5以降では、ユーティリティ関数がStringクラスのように変更できないクラスに関連する場合、拡張メソッドを使用することがあります。 Intellisenseは、プロジェクト内の文字列オブジェクトに拡張メソッドを表示します。

6

注意してください!

  • クロスカットの汎用ユーティリティ関数は、より高いユーティリティ名前空間に存在する必要があります。文字列解析、ファイル操作など

  • 拡張オブジェクトは、それぞれ固有の名前空間に存在する必要があります。

  • 指定されたビジネスオブジェクトまたはメソッドセットに適用されるユーティリティ関数は、それらのオブジェクトの名前空間内に存在する必要があります。多くの場合、ヘルパー接尾辞、つまりBusinessObjectHelperを使用します。 ここでの名前付けは重要です。その他のメソッド用のコンテナを作成していますか、それを特殊なオブジェクト、つまりパーサーにグループ化する方が理にかなっていますか?

3

C#3.0を使用している場合は、拡張メソッドを使用することをお勧めします。

public static class StringExtensions 
{ 
    public static string RemoveFirstLine(this string myString) 
    { 
     return myString.Remove("line..!"); 
    } 
} 

その後のコードで、あなたがこれを行うことができます:

string myString = "Hello World etc"; 

string removedLineString = myString.RemoveFirstLine(); 
+1

私は一般的に拡張メソッドが嫌いです。それらはクラスとライブラリの機能のカプセル化を破ります。ネットライブラリを "修正"するのは誰ですか?今すぐ誰かが私のコードmyString.Whargarble()のいくつかのメソッドを実行します。その方法はどこにありますか? 私はmyString = MyCompany.StringUtils.Whargarble(myString)は何が起こっているのより明確な声明だと思います。 –

+0

それはあなたのコードを実装する方法:フェアポイント、それまであなた:)エクステンションが修正と見なされているかどうかは分かりません。彼らはそれをクリックしてF12を選択し、intellisenseの小さなアイコンでその拡張方法を識別することによってそれを見つける。あなたが拡張名前空間にそれらを追加すると、それらは間に合わないでしょう。あなたはそれを使って明示的に "オプトイン"します。私はそれに個人的に問題はありません。それはどのように "機能のカプセル化を壊すだろう"!エクステンションクラス内にカプセル化されています! –

0

拡張機能は、これらの場合には移動するための方法です。文字通り、その機能にあなたの機能を追加します。唯一のことは、2008年に静的メソッドを実行することができないということです。

関連する問題