【protectedなどの使い方】C#のアクセス修飾子を解説その2
前回の【internalの使い方】C#のアクセス修飾子を解説その1では、主にinternal修飾子について解説してきました。次はprotected修飾子など他のアクセス修飾子の使い方などを掘り下げていきます。
publicやprivateの使い方は理解できていても、protectedまで理解できていない方も多いかと思います。コーディングの幅を広げるためにも、ここで基本的なアクセス修飾子の使い方はマスターしましょう。
- プログラマー
- アクセス修飾子は主に、public、private、internal、protectedに分かれると思いますが、どれも重要になってくるから覚えておかなければならないですよね?
- プロジェクト
リーダー - もちろん全部重要です!前回はinternalについて解説しましたが、今回は他のすべてのアクセス修飾子について使い方を解説します。
実行環境
・Visual Studio Community 2017
publicアクセス修飾子の使い方
C#で使うアクセス修飾子の代表格です。開発初心者の方がまず教わるのが、こちらのpublic修飾子だと思います。
publicはどこからでもアクセス可能な点が特徴として挙げられます。これは非常に便利です。どのアクセス修飾子を使う迷った場合には、publicを使えばプログラムは動作します。
しかし、開発する場合には便利ですが、修正する場合には作業が複雑になります。どこからでもアクセス可能なので、修正することでどこまで動作に影響するのかといった確認作業が必要です。そういったことも念頭に置いて、publicを使っての開発は行うべきだといえます。
1
2
3
4
5
6
7
8
9
10
11
12
|
using System;
namespace TESTCLASS
{
public class Class1
{
public void GetName()
{
Console.WriteLine("public");
}
}
}
|
以下のプログラムにて、TESTCLASS.dllを参照します。実行するプログラムです。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
using System;
using System.Windows.Forms;
using TESTCLASS;
namespace WindowsFormsApp28
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Class1 bbb = new Class1();
bbb.GetName();
}
}
}
|
実行結果
protectedアクセス修飾子の使い方
publicやinternalが使いこなせれば、あとはprotectedもマスターしておきましょう。
protectedを理解する前に、前提知識として必要なのが「継承」です。C#で開発する場合、この継承はよく出てくる命令のひとつです。継承には親と子のような関係が発生し、継承元クラスを基底クラス(スーパークラス)、継承先のクラスを派生クラス(サブクラス)と呼ばれます。
基底クラス側のみで利用するならば、通常はprivateを使用します。派生クラスからの参照がある場合に、protectedを使用します。
1
2
3
4
5
6
7
8
9
10
11
12
|
using System;
namespace TESTCLASS
{
public class Class2
{
protected void GetName2()
{
Console.WriteLine("protected");
}
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
|
using System;
namespace TESTCLASS
{
public class Class1 : Class2
{
public void GetName()
{
GetName2();
}
}
}
|
以下のプログラムにて、TESTCLASS.dllを参照します。実行するプログラムです。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
using System;
using System.Windows.Forms;
using TESTCLASS;
namespace WindowsFormsApp28
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Class1 bbb = new Class1();
bbb.GetName();
}
}
}
|
実行結果
privateアクセス修飾子の使い方
publicの次に多く使われるのが、こちらのprivateアクセス修飾子です。アクセスできる度合いが自分のクラスだけなので制限が一番厳しい修飾子です。
外部から参照されないメソッドや変数などは基本的にはprivateを利用して開発を行います。また、何もアクセス修飾子を明記しなければ、privateが自動的に割り当てられます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
using System;
using System.Windows.Forms;
namespace WindowsFormsApp28
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
GetName3();
}
private void GetName3()
{
Console.WriteLine("private");
}
}
}
|
実行結果
private protectedアクセス修飾子の使い方
こちらはC#7.2以降から搭載されたアクセス修飾子です。上述のprotectedアクセス修飾子とほとんど同じで、継承の親子関係で使用されます。唯一違う点が、他のプロジェクト(≒アセンブリ)からはアクセスできないことです。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
using System;
namespace WindowsFormsApp28
{
public class Class4
{
private protected int num = 2;
private protected int num2 = 5;
public int Num
{
set { num = value; }
get { return num; }
}
public int Num2
{
set { num2 = value; }
get { return num2; }
}
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
using System;
namespace WindowsFormsApp28
{
public class Class3 : Class4
{
public void add()
{
Console.WriteLine("{0} + {1} = {2}", num, num2, num + num2);
}
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
using System;
using System.Windows.Forms;
namespace WindowsFormsApp28
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Class3 ttt = new Class3();
ttt.add();
}
}
}
|
実行結果
- プログラマー
- アクセス修飾子の使い方を理解できました。これは他の言語でも同じように必要になってくるのでしょうか?
- プロジェクト
リーダー - 同じく.NET Frameworkで開発できるVB.NETでは、protected privateは使えませんし、internalはFriendに置き換わるなど多少の違いはあります。ですが意味は同じなので、ここで使い方をマスターすれば他の言語でも十分に活用できるでしょう。
アクセス修飾子は他の言語でも利用されている
クラスを使ってプログラミングを行うオブジェクト指向の言語では、JavaでもC++でもこのアクセス修飾子は出てきます。オブジェクト指向で開発を行う上では、publicやprivateだけに頼らずに、protected、internalも早めにマスターして、積極的に使い分けていきましょう。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。
-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社夢真ビーネックスグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。
C#新着案件New Job
-
システム開発/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(新宿駅) -
システム開発/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(新宿駅) -
デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円神奈川県横浜市(桜木町駅) -
デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円神奈川県横浜市(桜木町駅) -
基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(西新宿駅) -
基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(西新宿駅)