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回




ディスカッション
コメント一覧
まだ、コメントがありません