Hatena::ブログ(Diary)

My Programing Diary

2010-07-20

静的メソッド内で静的でないメンバは使用できない

Main メソッドなどの static メソッドの中では、静的でない通常のメンバを参照することはできません。

静的でないメンバを参照する場合は、静的でないメンバが含まれているクラスのインスタンスを生成する必要があります。


例えば以下の例では、Main メソッドの外に定義されている i と fin を Main メソッドの中で参照しようとするとコンパイルエラーが発生します。

using System;
using System.IO;

namespace ReadOnlyByteData
{
    class ReadOnlyByteData
    {

        int i;
        FileStream fin;

        public static void Main(string[] args)
        {
            try
            {
                fin = new FileStream("text.dat", FileMode.Open, FileAccess.Read);  // fin を参照できない。
            }
            catch (IOException exc)
            {
                Console.WriteLine(exc.Message);
                return;
            }

            do
            {
                try
                {
                    i = fin.ReadByte();  // i を参照できない。
                    if (i == -1) break;
                    Console.WriteLine(i);
                }
                catch (IOException exc)
                {
                    Console.WriteLine(exc.Message);
                    return;
                }
            } while (fin.ReadByte() != -1);


            Console.ReadLine();
        }
    }
}

上記のコンパイルエラーを解決するには、

  • i と fin をstatic なメンバにする
  • クラスをわける

になります。それぞれの例を記載します。


i と fin をstatic なメンバにする

using System;
using System.IO;

namespace ReadOnlyByteData
{
    class ReadOnlyByteData
    {

        static int i;
        static FileStream fin;

        public static void Main(string[] args)
        {
            try
            {
                fin = new FileStream("text.dat", FileMode.Open, FileAccess.Read);
            }
            catch (IOException exc)
            {
                Console.WriteLine(exc.Message);
                return;
            }

            do
            {
                try
                {
                    i = fin.ReadByte();
                    if (i == -1) break;
                    Console.WriteLine(i);
                }
                catch (IOException exc)
                {
                    Console.WriteLine(exc.Message);
                    return;
                }
            } while (fin.ReadByte() != -1);


            Console.ReadLine();
        }
    }
}


クラスをわける


using System;
using System.IO;

namespace ReadOnlyByteData
{
    class ReadOnlyByteData
    {

        int i;
        FileStream fin;

        public int I
        {
            set { this.i = value; }
            get { return this.i; }
        }

        public FileStream Fin
        {
            set { this.fin = value; }
            get { return this.fin; }
        }

    }

    class Demo
    {
        public static void Main(string[] args)
        {
            ReadOnlyByteData robd = new ReadOnlyByteData();
            
            try
            {
                robd.Fin = new FileStream("text.dat", FileMode.Open, FileAccess.Read);
            }
            catch (IOException exc)
            {
                Console.WriteLine(exc.Message);
                return;
            }

            do
            {
                try
                {
                    robd.I = robd.Fin.ReadByte();
                    if (robd.I == -1) break;
                    Console.WriteLine(robd.I);
                }
                catch (IOException exc)
                {
                    Console.WriteLine(exc.Message);
                    return;
                }
            } while (robd.Fin.ReadByte() != -1);

            Console.ReadLine();
        }
    }
}


まあ、ちょっとコード試すぐらいだったら、回りくどいことをせずに、i と fin を Main メソッドに入れてしまえばいいかなー。

using System;
using System.IO;

namespace ReadOnlyByteData
{
    class ReadOnlyByteData
    {
        public static void Main(string[] args)
        {
            int i;
            FileStream fin;

            try
            {
                fin = new FileStream("text.dat", FileMode.Open, FileAccess.Read);
            }
            catch (IOException exc)
            {
                Console.WriteLine(exc.Message);
                return;
            }

            do
            {
                try
                {
                    i = fin.ReadByte();
                    if (i == -1) break;
                    Console.WriteLine(i);
                }
                catch (IOException exc)
                {
                    Console.WriteLine(exc.Message);
                    return;
                }
            } while (fin.ReadByte() != -1);


            Console.ReadLine();
        }
    }
}

kyokyle13kyokyle13 2010/07/24 02:47 ああーそうか。へー。ふむふむ。なるほどねー。

shingotadashingotada 2010/07/24 10:29 まあ、この手のやつをバシバシ上げていきますよ。