C#の「省略するとこうなる」ルール集(アクセス修飾子・既定値まとめ)

C#は「書かなくても決まる(既定値がある)」ものが多いです。初学者がつまずきやすいのは、**省略した結果が“暗黙にそうなる”**ところ。ここでは、よく出るルールを「省略 → どうなる」でまとめます。


アクセス修飾子(public / private / protected / internal)

フィールド(クラスのメンバー変数)

class Player
{
    int hp;   // ← 省略
}
  • 結論:private 扱い
  • クラスのフィールドは、アクセス修飾子を省略すると private になります。

メソッド(クラスのメンバー関数)

class Player
{
    void Damage(int x)  // ← 省略
    {
    }
}
  • 結論:private 扱い
  • クラス内のメソッドも、アクセス修飾子を省略すると private になります。

プロパティ

class Player
{
    int Hp { get; set; }  // ← 省略
}
  • 結論:private 扱い
  • クラス内プロパティも同様に private です。

なので「外から触れるようにしたい(他クラスから使いたい)」なら public を明示する必要があります。


クラス(型そのもの)

class Player   // ← 省略
{
}
  • 結論:internal 扱い(トップレベルの場合)
  • namespace 直下に置く「トップレベルの型」は、アクセス修飾子を省略すると internal になります。→ 同じプロジェクト内では見えるが、別プロジェクトから参照できません。

ネストした型(クラスの中にクラス)

class A
{
    class B { }  // ← 省略
}
  • 結論:private 扱い
  • クラスの中に入れた型は、修飾子を省略すると private です。

static(省略するとインスタンスメンバー)

メソッド

class Tool
{
    void Run() { }  // ← static 省略
}
  • 結論:インスタンスメソッド
  • static を省略すると、そのメソッドは new してから使うメソッドになります。

フィールド

class Counter
{
    int value;  // ← static 省略
}
  • 結論:インスタンスごとに別々
  • static を付けないフィールドは、インスタンスごとに値を持つようになります。

変数の既定値(初期化しなかったらどうなる)

フィールドは既定値が入る

class Sample
{
    int n;        // 0
    bool flag;    // false
    string s;     // null
}
  • 結論:フィールドは自動で既定値が入る
    • int → 0
    • bool → false
    • 参照型(stringなど)→ null

ローカル変数は既定値が入らない

static void Main()
{
    int n;
    Console.WriteLine(n); // エラー(使う前に代入が必要)
}
  • 結論:ローカル変数は“必ず自分で代入”が必要
  • ここがフィールドと大違いです。

const / readonly(似てるけど違う)

const

const int Tax = 10;
  • 結論:コンパイル時に固定
  • 書いた瞬間に「完全固定」。実行中に変更不可。

readonly

readonly int id;

public Sample(int id)
{
    this.id = id; // コンストラクタで1回だけ代入OK
}
  • 結論:実行時に決まって、その後固定
  • 代入できるタイミングが const より遅い(コンストラクタで決められる)。

switch の default、if の else

default(switch)

switch (x)
{
    case 1: break;
    // default 省略
}
  • 結論:どれにも当たらない時は何も起きない
  • default は「必須」ではないけど、想定外入力の処理が抜けやすいです。

else(if)

if (x > 0)
{
}
// else 省略
  • 結論:条件が偽なら何もしない
  • 「偽のときの処理が必要か」を毎回意識すると事故が減ります。

よくある勘違いまとめ

  • 「省略=public」ではない→ クラス内のメンバーは、基本 private が既定。
  • 「フィールドは勝手に0になる」けど、ローカル変数はならない→ これを知らないと初学者は混乱しやすい。
  • staticの省略は“インスタンス化が必要”になる→ Main から呼べない原因になりやすい。

現場でのおすすめ運用

  • 「外から使う予定があるメンバーだけ public」にする
  • 迷ったらまず private。必要になったら public に上げる
  • ローカル変数は「宣言したらすぐ代入」を癖にする
  • static を使うのは「道具クラス」「共通の値」など理由があるときだけ

(CS0122 / CS0165 / CS0103)

C#は「書かなかった場合どうなるか」が決まっています。

そしてその“暗黙の既定値”を知らないと、エラーになります。

今日は授業で特に多い3つを、短く整理します。


CS0122

「アクセスできない保護レベルです」

原因:private が既定

class Player
{
    void Damage(int x)  // ← 省略=private
    {
    }
}
Player p = new Player();
p.Damage(10);   // CS0122

メソッドは省略すると private

外から呼べません。

解決

public void Damage(int x)

CS0165

「未割り当てのローカル変数を使用」

原因:ローカル変数は自動初期化されない

static void Main()
{
    int x;
    Console.WriteLine(x);  // CS0165
}

フィールドは0やnullが入りますが、

ローカル変数は入りません。

解決

int x = 0;

CS0103

「現在のコンテキストに存在しません」

原因①:スコープ外

if (true)
{
    int count = 5;
}

Console.WriteLine(count);  // CS0103

countはifの中だけ。


原因②:staticを省略

class Tool
{
    void Run() { }
}

class Program
{
    static void Main()
    {
        Run();  // CS0103
    }
}

理由

  • Runはインスタンスメソッド
  • Mainはstatic
  • さらにクラスも違う

解決①(staticにする)

class Tool
{
    public static void Run() { }
}

class Program
{
    static void Main()
    {
        Tool.Run();
    }
}

解決②(インスタンスを作る)

new Tool().Run();

ポイント:

staticなら「クラス名.メソッド名」

staticでなければ「newして呼ぶ」

class Tool
{
    void Run() { }
}

static void Main()
{
    Run();  // CS0103
}

Runはインスタンスメソッド。

Mainはstatic。


まとめ

エラー実はこれが原因
CS0122メンバーは既定でprivate
CS0165ローカル変数は自動初期化されない
CS0103スコープ外 or static不足

授業で伝えたいこと

C#は「勝手に都合よくしてくれない」言語です。

  • publicは自分で書く
  • 値は自分で代入する
  • 見える範囲は自分で考える

エラーは失敗ではなく、

省略の裏にあるルールを教えてくれているだけ。

訪問数 5 回, 今日の訪問数 5回

記事下広告