2

列挙型 (DemoEnum としましょう) があり、この列挙型の値を解析したいと考えています。書いています

DemoEnum value;
if(DemoEnum.TryParse("input", out value))
{
   this.Value = value;
}

リシャーパーは、基本クラス修飾子を使用することを提案しています。

基本クラス修飾子を使用する利点は何ですか?

4

4 に答える 4

6

一般に、可能な限り最も一般的なソリューションを使用することをお勧めします。

DemoEnum.TryParse("input", out value)

と同じ呼び出しです (基本クラスではなく、継承されたクラスから静的呼び出しを行っているだけです):

Enum.TryParse<DemoEnum>("input", out value)

Enum特定の列挙型 ( ) の代わりに基底クラス修飾子 ( ) を使用すると、将来DemoEnumの変更による副作用を回避できます。DemoEnum現実には、名前を変更せずに DemoEnum をクラスに変更した場合にのみ、実際に問題が発生することになります。

これは通常、クラスを使用する場合のより大きな問題です (ReSharper は、これらの状況で同じガイダンスを提供します)。

于 2012-04-30T13:42:00.023 に答える
1

メソッドは、クラスTryParse()で定義された静的メソッドです。Enum列挙型はEnumクラスからすべてを継承するため、静的メンバーも「継承」します。これは真の継承ではなく、静的メンバーはクラスから見えるだけです。

他の答えは、あなたのために特別な翻訳が行われているという点で間違っています。すべての静的メンバーは列挙型を介してアクセスできるため、派生クラスから静的メンバーにアクセスするだけです。静的メソッドにアクセスしている識別子の型は、ジェネリック パラメーターが何であるかにはまったく関係がなく、コンパイラーがそれらから推測できるもの (または明示的に提供するもの) だけです

私の要点を説明するために、次の 2 つの列挙型を考えてみましょう。

enum First { A, B }
enum Second { A, B }

First firstVar;
Second secondVar;
// note we're using the `First` name
First.TryParse("A", out firstVar);  // valid, firstVar <= First.A
First.TryParse("B", out secondVar); // still valid, secondVar <= Second.B

// is equivalent to
Enum.TryParse<First>("A", out firstVar); // generic type is inferred from type of firstVar
Enum.TryParse<Second>("B", out secondVar); // generic type is inferred from type of secondVar

ReSharper が伝えていることは、実際にメンバーを定義したクラスから静的メンバーにアクセスする必要があるということです。なぜこれを行う必要があるのですか?

派生型がまったく同じ名前の静的メンバーを定義した場合にどうなるかを考えてみてください。(この場合、列挙型では不可能ですが、クラス全般に適用できます)その場合、コードはどうなりますか?派生クラスを介して静的メンバーにアクセスしたコードは新しい値を取得し、おそらくそれに関する新しい警告は表示されません。これは望ましい動作である場合とそうでない場合があるため、ReSharper は、それを定義した実際のクラス (ベース) を使用する必要があることを事前に警告しています。

于 2012-05-01T01:56:50.543 に答える
0

Resharper が Enum.TryParse の使用を提案しているようです - http://msdn.microsoft.com/en-us/library/dd783499.aspx

IL を見ればきっと... DemoEnum.TryParse は base.TryParse を実行しているだけです

于 2012-04-30T13:42:10.507 に答える
-1

を記述するDemoEnum.TryParseと、コンパイラはそれを に変換しEnum.TryParse<DemoEnum>ます。enum機能的な違いはなく、型でメソッドを定義できないため、再定義できないため、考えられる副作用から隔離する必要はありませんTryParse。私の最善の推測は、それがスタイルの好みだということです。

于 2012-04-30T13:49:35.413 に答える