アクセス修飾子はクラス外部のコードに対してのみ制限をかけます。クラス内部ではアクセスの隔離は発生しません
ここまでの学習で理解した通り、クラス内部からはすべてのメンバーに自由にアクセス可能です。
次に、クラス外部からメンバーへアクセスする方法を学びましょう。
クラス外部から公開インスタンスメンバーにアクセスするには「オブジェクト変数名.メンバー名」というドット構文を使用する必要があります。
class Program
{
static void Main(string[] args)
{
Worker worker = new Worker(); //オブジェクトを作成
int hours = worker.GetHours(); //オブジェクト経由でpublicメソッドを呼び出す
worker.hours = 12; //オブジェクトからpublic変数に値を代入
Console.WriteLine(worker.hours); //普通の変数と同じように値を参照
}
}
class Worker
{
int age;
private double savings;
public int hours;
void ReadSavings()
{
Console.WriteLine(savings);
}
public int GetHours()
{
return hours;
}
}Code language: C# (cs)
Worker のメソッド GetHours には public が指定されているため、外部から読み書きできます。
Program クラスの Main メソッドで Worker 型オブジェクト worker を生成しています。
オブジェクト名 worker を通じてアクセスします。オブジェクト名はポインタのような役割で参照(メモリアドレス)を保持し、ドット . と組み合わせることで公開メンバーにアクセスできます。

外部からインスタンスメンバーにアクセスする書式:オブジェクト変数.公開フィールド/公開メソッド()。
private メンバーはクラス外部からドット構文でアクセスできません。

クラス外部からプライベートメンバー(フィールド・関数)にアクセスしようとすると、コンパイルエラーが発生します。
エラーとなる例
class Program
{
static void Main(string[] args)
{
Worker worker = new Worker();
int hours = worker.GetHours();
worker.hours = 12;
Console.WriteLine(worker.hours);
worker.ReadSavings();
worker.age = 20;
worker.savings = 1000000000.0;
}
}
class Worker
{
int age;
private double savings;
public int hours;
void ReadSavings()
{
Console.WriteLine(savings);
}
public int GetHours()
{
return hours;
}
}Code language: C# (cs)
別の例を見てみましょう
class Rectangle
{
// 公開インスタンスフィールド:縦 Length、横 Width
public int Length, Width;
// インスタンスメソッド:矩形の面積を計算して返す
public int GetArea()
{
return Length * Width;
}
}
class Program
{
static void Main()
{
// 独立した矩形インスタンスを2つ作成
Rectangle rect1 = new Rectangle();
Rectangle rect2 = new Rectangle();
// それぞれ長さを設定、データは相互に隔離される
rect1.Length = 10; rect1.Width = 5;
rect2.Length = 8; rect2.Width = 7;
// 値を参照し、メソッド実行で面積を出力
Console.WriteLine("矩形1:縦{0},横{1},面積{2}", rect1.Length, rect1.Width, rect1.GetArea());
Console.WriteLine("矩形2:縦{0},横{1},面積{2}", rect2.Length, rect2.Width, rect2.GetArea());
}
}Code language: C# (cs)
こちらは矩形のクラスです。Length と Width という2つの公開フィールドに長辺・短辺の値を保持し、GetArea メソッドで面積を算出します。
これらのメンバーはすべて公開状態です。
実行結果
矩形1:縦10,横5,面積50
矩形2:縦8,横7,面積56
メモリ上の保持構造はこちら

2つのオブジェクトは独立して確保され、それぞれ固有の Length と Width を持ち、互いに影響を与えません。
クラス外部からのメンバーアクセス