2017-01-29 5 views
0

これは私の最初の投稿です。私はこのコミュニティに参加することを楽しみにしています。静的メソッドで使用するとC#enum型を静的宣言する必要がないのはなぜですか?

私は当初、コードのコンパイルに問題がありました。私は辞書の中で変換値を呼び出す静的メソッドを持っていました。いくつかの研究の後、メソッドを静的宣言するだけでなく変数も宣言する必要があることを知りました。私を困惑何

はPressur.Unitタイプに対する列挙型がstaticとして宣言する必要がないことです。私はdoubleやint型のような他の変数を使っていましたが、静的メソッド内で使用するにはstaticとも呼ばれる必要があるようです。

は、誰もが、それは、静的と呼ばれることなく動作することができます列挙型について特別であるかを正確に私に説明できますか?実際には、宣言に静的を追加すると、コンパイルエラーも発生します。

この

は、私のコードのスナップショットです:私は現在、Visual Studioの14.0.25431.01アップデートを使用しています

public class Pressure 
    { 
     public enum Unit 
     { 
      psi, 
      psf, 

      mPa, 
      Pa, 
      hPa, 
      kPa, 
      MPa, 

      mmH2O, 
      mH2O, 
      inH2O, 
      ftH2O, 

      mmHg, 
      inHg, 

      atm, 
      bar, 

      kgcm2    
     } 


     // Conversions for each unit to/from Pa 
     private static readonly Dictionary<Unit, double> conversions = new Dictionary<Unit, double>() 
     { 
      { Unit.psi, 6894.76 }, 
      { Unit.psf, 47.9 }, 

      { Unit.mPa, 0.001 }, 
      { Unit.Pa, 1 }, 
      { Unit.hPa, 100 }, 
      { Unit.kPa, 1000 }, 
      { Unit.MPa, 1000000 }, 

      { Unit.mmH2O, 9.80665 }, 
      { Unit.mH2O, 980.665 }, 
      { Unit.inH2O, 248.84 }, 
      { Unit.ftH2O, 2986.08 }, 

      { Unit.mmHg, 133.322 }, 
      { Unit.inHg, 3386.39 }, 

      { Unit.atm, 101325 }, 
      { Unit.bar, 100 }, 

      { Unit.kgcm2, 98068} 
     }; 


     /// <summary> 
     /// Converts pressure between engineering units. 
     /// </summary> 
     /// <param name="value">Pressure value</param> 
     /// <param name="unitIn">Pressure unit of input value</param> 
     /// <param name="unitOut">Pressure unit of returned value</param> 
     /// <returns>Pressure value in the output pressure unit.</returns> 
     public static double Convert(double value, Unit unitIn, Unit unitOut) 
     { 
      return value * conversions[unitIn]/conversions[unitOut]; 
     } 
    } 

あなたは決して非静的メンバにアクセスしていないしているので問題はありません。3.

答えて

0

タイプUnitです。

この場合、定数と実際には違っていない列挙メンバにのみアクセスしています。

がこのよう考えてみましょう:一つだけありますので、

  • な列挙メンバーを使用して、コンパイラが選ぶためにどの値を正確に知っている(定義は、本質的に静的です)。
  • 静的でないメンバー変数にアクセスしようとすると、コンパイラはどのインスタンス/オブジェクトのメンバーにアクセスしたいのか分かりません。それだけで定義、メンバーじゃないのかPersonの財産だから、

    class Person { 
        enum Gender { 
         Man, Woman, Thing 
        }; 
    
        Gender gender; 
        string name; 
    } 
    

    はいつでもGender.Manなどを使用することができます。

はここでよりよいこれを可視化するための別のクラスです。あなたが求めることができます任意の時点で

Manは何?」それは単なる定義なので、答えを知っています。今

しかし尋ねるしよう「genderは何?」 Personは非静的メンバー変数なので、これを知らなくてもこれに答えることはできません。

+0

ありがとうございます。 –

0

これは、列挙型が定数の列挙型であるためです。

列挙型を使用するには、まだ、その場合には、そのインスタンスは、静的することができ、そのインスタンスを必要とします。

public enum Unit 
    { 
     psi, 
     psf, 

     mPa, 
     Pa, 
     hPa, 
     kPa, 
     MPa, 

     mmH2O, 
     mH2O, 
     inH2O, 
     ftH2O, 

     mmHg, 
     inHg, 

     atm, 
     bar, 

     kgcm2 
    } 

    public static Unit MyUnit { get; set; } = Unit.hPa; 
+0

ありがとうございます。あなたがまだenumのインスタンスを必要としていると私は少し混乱しています。私のコードでは、そのインスタンスが表示されません。または、名前空間が呼び出されたときに自動的にインスタンス化されますか? –

+0

さて、Enumが自動的に静的であたかも定数のリストを公開しているかのように見てください。それ以上はありますが、簡単にするために私はそれについていくつもりです。たとえば...あなたが使っている方法は、私がここから見たものから、クラスを定数にすることと変わりありません。それから、クラスを呼び出すだけです。定数名ex:MyClass {public const int psi} ... var value = MyClass.psi;私はあなたがコメントにコードを入れることができたらいいと思う。 –

+0

これはenumの適切な使用ですか?どうもありがとう。 –

0

コンバージョンは変数であり、静的メソッドから呼び出す場合はstaticと宣言する必要があります。

なぜなら、静的変数/メソッドはクラスの特定のインスタンスに属しているからです。静的変数/メソッドはそうではありません。クラスの静的な部分です(つまり、クラスをインスタンス化せずに呼び出すことができます) 。

ユニットは変数でもメソッドでもなく、特定のインスタンスにバインドされないタイプです。

enumがクラス内で定義されているという事実は、nestedを使用するため、使用するためにはそれを含むクラスを参照する必要がありますが、インスタンスにバインドされていないという事実は変わりません。

+0

ありがとうございます、私は列挙型が変数とみなされていなかったことを認識しませんでした。私の理解は、enumは定数のグループのようなものです。これは正しいです? –

+0

@FrankPerenyクラスと構造体(int、double、boolean、char、...)のような列挙型は型です。 Variable!=タイプ、変数は特定のタイプの変数、タイプの変数、タイプの変数、タイプの変数、Unitタイプの変数... はい、Enumは名前付き定数のグループ 参照: https://msdn.microsoft.com/en-us/library/sbbt4032.aspx – areller

+0

ありがとう、私はすべてのあなたの答えをupvoteしたいと思いますが、私はまだ能力がありません。 –

0

conversionsは、オブジェクトのインスタンスを含む静的変数です。したがって、

{ Unit.psi, 6894.76 }, 
{ Unit.psf, 47.9 }, 
{ Unit.mPa, 0.001 }, 
// ... 

は、辞書の単なる通常のエントリです。

簡略化のリスクがある場合、enumtypeであり、実際のインスタンスではありません。 (注:enumの「基礎となる」タイプはintです)。静的変数やメソッドで使用するには、型を静的にする必要はありません。たとえば、静的変数のタイプがDictionaryであることは間違いなくではなく、 staticです。

Unit.mPaのようなものを使用すると、実際のインスタンスを取得するよりも定数として考える方が便利です。実際、documentationは、 "列挙子リストと呼ばれる名前付き定数のセットで構成される個別の型"として列挙型を定義しています。

実際に静的であることが本当に意味をつけるのは、変数とメソッドだけです。明らかに、メソッドが静的であれば、変数も静的でなければなりません(ただし逆は真ではなく、インスタンスメソッドから静的変数を呼び出すことができます)。

うまくいけば、これは少し物事を明確にします(もし私が編集できるようにコメントしてください)。

+0

感謝します。私は、変数doubleや辞書のようにenumを検討していたのが私の混乱でした。 –

関連する問題