Earn More by Sharing What You Love
Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!

Tim Corey
46分57秒
この記事では、C#における型、メソッド、変数の可視性とアクセシビリティを定義するC#アクセス修飾子について説明します。 ティム・コーリーのビデオ"C# Access Modifiers (beyond public and private) - what they are, how to use them, and best practices"では、さまざまなアクセス修飾子について説明し、コンソールアプリケーションでの実際の使い方を実演しています。
この記事では、理解を深めるためのコード例とともに、Timがカバーする内容を説明します。 提供されるタイムスタンプは、より実践的な体験のためにビデオと一緒にフォローすることができます。
Tim Corey氏はまず、アクセス修飾子について紹介し、C#ではアクセス修飾子がリソースを誰が見たり使ったりできるかを決定すると説明しています。 一般的に使用されるpublic修飾子やprivate修飾子についてはよく知られていますが、Timは6つの異なるアクセス修飾子とその使用例を探ります。
Timは、さまざまなアクセス修飾子がどのように機能するかを示すために、簡単なアプリケーションをセットアップします。 アプリケーションは、.NETフレームワークのコンソールユーザーインターフェイスとデモライブラリで構成されています。
public class AccessDemo
{
private void PrivateDemo() { }
internal void InternalDemo() { }
public void PublicDemo() { }
}Public Class AccessDemo
Private Sub PrivateDemo()
End Sub
Friend Sub InternalDemo()
End Sub
Public Sub PublicDemo()
End Sub
End Classprivate 修飾子は、メソッド、フィールド、またはプロパティへのアクセスを、それが定義されているクラス内でのみ制限します。
public class AccessDemo
{
private void PrivateDemo()
{
Console.WriteLine("Private method can only be accessed within this class.");
}
public void CallPrivateDemo()
{
PrivateDemo(); // Works because it's within the same class
}
}Public Class AccessDemo
Private Sub PrivateDemo()
Console.WriteLine("Private method can only be accessed within this class.")
End Sub
Public Sub CallPrivateDemo()
PrivateDemo() ' Works because it's within the same class
End Sub
End Class説明: PrivateDemo メソッドは AccessDemo クラス内でのみアクセス可能です。 ビデオの中でティムは、同じプロジェクト内に他のクラスがあっても、クラスの外からアクセスできないことを実演しています。
ベストプラクティス:クラスの内部動作へのアクセスを制限し、アプリケーションの他の部分から直接変更できないようにしたいときは、privateを使用してください。
内部修飾子は、同じアセンブリ(プロジェクト)内でのみ、メソッドやプロパティへのアクセスを許可します。 これは、同じプロジェクト内のすべてのクラスを含むため、プライベートアクセス修飾子よりも広いです。
public class AccessDemo
{
internal void InternalDemo()
{
Console.WriteLine("Internal method is accessible within the same assembly.");
}
}Public Class AccessDemo
Friend Sub InternalDemo()
Console.WriteLine("Internal method is accessible within the same assembly.")
End Sub
End Class説明: InternalDemo メソッドは同じアセンブリ内のどのクラスからもアクセス可能ですが、他のアセンブリからはアクセスできません。 ビデオの中でティムは、internalが同じプロジェクト内でのアクセスを許可し、外部からのアクセスを拒否することを示しています。
ベストプラクティス:外部プロジェクトに公開されるべきでないヘルパー関数やユーティリティなど、現在のアセンブリ内でのみ使用されるメソッドやプロパティには internal を使用してください。
public修飾子は、他のクラスやアセンブリからメソッドやプロパティにアクセスできるようにします。 これは最も寛容なアクセスレベルです。
public class AccessDemo
{
public void PublicDemo()
{
Console.WriteLine("Public method can be accessed from any class.");
}
}Public Class AccessDemo
Public Sub PublicDemo()
Console.WriteLine("Public method can be accessed from any class.")
End Sub
End Class説明: PublicDemo メソッドはどこからでもアクセス可能で、同じアセンブリや他のアセンブリの他のクラスからもアクセスできます。 Timは、特にライブラリでメソッドを公開する場合、publicが最も一般的なアクセス修飾子であることを示します。
ベストプラクティス:APIエンドポイントや広く使われているユーティリティなど、アプリケーションの他の部分や外部プロジェクトからアクセスする必要があるメソッドやプロパティにはpublicを使用してください。
protected 修飾子は、メソッドやプロパティが定義されているクラス内、および派生クラス(継承)内でのアクセスを許可します。 この修飾子は、オブジェクト指向プログラミング、特に継承の場合に便利です。
public class AccessDemo
{
protected void ProtectedDemo()
{
Console.WriteLine("Protected method can be accessed within the class and derived classes.");
}
}
public class DerivedClass : AccessDemo
{
public void CallProtectedDemo()
{
ProtectedDemo(); // Accessible because of inheritance
}
}Public Class AccessDemo
Protected Sub ProtectedDemo()
Console.WriteLine("Protected method can be accessed within the class and derived classes.")
End Sub
End Class
Public Class DerivedClass
Inherits AccessDemo
Public Sub CallProtectedDemo()
ProtectedDemo() ' Accessible because of inheritance
End Sub
End Class説明: ProtectedDemo メソッドは AccessDemo クラスおよびこれを継承する任意のクラスからアクセス可能です。 ティムは、protectedはあまり一般的ではないが、継承を扱うときに非常に役に立つと説明する。
ベストプラクティス:派生クラスが特定のメソッドやプロパティにアクセスできるようにしたいが、クラス階層の外からはアクセスさせたくない場合に protected を使用します。
private protected修飾子は、privateとprotectedのルールを組み合わせたものです。 これは、定義クラスと同じアセンブリ内の派生クラス内のメソッドまたはプロパティへのアクセスを制限します。 つまり、protectedと比較して、継承ベースのアクセス制御の保護レベルと境界がより厳しくなります。
public class AccessDemo
{
private protected void PrivateProtectedDemo()
{
Console.WriteLine("Private Protected method can be accessed within the same assembly and derived classes.");
}
}
public class DerivedClass : AccessDemo
{
public void CallPrivateProtectedDemo()
{
PrivateProtectedDemo(); // Accessible because of inheritance within the same assembly
}
}
public class UnrelatedClass
{
public void TestAccess()
{
// PrivateProtectedDemo(); // Error: Not accessible in unrelated classes
}
}Public Class AccessDemo
Private Protected Sub PrivateProtectedDemo()
Console.WriteLine("Private Protected method can be accessed within the same assembly and derived classes.")
End Sub
End Class
Public Class DerivedClass
Inherits AccessDemo
Public Sub CallPrivateProtectedDemo()
PrivateProtectedDemo() ' Accessible because of inheritance within the same assembly
End Sub
End Class
Public Class UnrelatedClass
Public Sub TestAccess()
' PrivateProtectedDemo() ' Error: Not accessible in unrelated classes
End Sub
End Class説明: PrivateProtectedDemo メソッドは同じアセンブリに存在し、DerivedClass でアクセス可能です。それは AccessDemo を継承しているからです。 しかし、UnrelatedClass ではアクセスできません。なぜなら、このクラスは AccessDemo を継承していないからです。
ベストプラクティス:private protected アクセス修飾子は、同じアセンブリ内の継承アクセスを厳密に制御する必要がある場合に、控えめに使用してください。 これは、アセンブリ間でメソッドやプロパティを公開するとカプセル化が損なわれる可能性がある場合に特に役立ちます。
protected internal修飾子は、protectedレベルとinternalアクセス修飾子レベルを組み合わせたものです。 同じアセンブリからのアクセスや、派生クラスが別のアセンブリにある場合でもアクセスできるようにします。
public class AccessDemo
{
protected internal void ProtectedInternalDemo()
{
Console.WriteLine("Protected Internal method can be accessed within the same assembly or from derived classes.");
}
}
public class DerivedClass : AccessDemo
{
public void CallProtectedInternalDemo()
{
ProtectedInternalDemo(); // Accessible due to inheritance
}
}Public Class AccessDemo
Protected Friend Sub ProtectedInternalDemo()
Console.WriteLine("Protected Internal method can be accessed within the same assembly or from derived classes.")
End Sub
End Class
Public Class DerivedClass
Inherits AccessDemo
Public Sub CallProtectedInternalDemo()
ProtectedInternalDemo() ' Accessible due to inheritance
End Sub
End Class説明: ProtectedInternalDemo メソッドは同じアセンブリ内およびアセンブリに関係なく、どの派生クラスからもアクセス可能です。
ベストプラクティス:メソッドを(他のアセンブリの)派生クラスと同じアセンブリのクラスの両方に公開したいが、全員に公開したくない場合に protected internal を使用してください。
ティム・コリーは、アクセス修飾子を使用することの重要性と、すべてを公開するだけではいけない理由を説明しています。 すべてを公開することは便利に見えるかもしれませんが、データ漏洩、バグ、開発の混乱など、重大なリスクをもたらします。 アクセス修飾子は、情報を保護し、意図しない一般からのアクセスを防ぎ、コードベースを明確にするために存在します。
Timは、社会保障番号(SSN)やクレジットカード番号などの機密情報を公開すべきではない理由について説明します。 彼は、一般からのアクセスによってデータの漏洩が発生する"悪いクラス"の例を示しています:
**悪い例: **
public class User
{
public string SSN; // Anyone can access and modify it directly
}Public Class User
Public SSN As String ' Anyone can access and modify it directly
End Class良い例:
public class User
{
private string ssn;
public string GetMaskedSSN()
{
return "XXX-XX-" + ssn.Substring(ssn.Length - 4);
}
public void SetSSN(string value)
{
// Add validation if needed
ssn = value;
}
}Public Class User
Private ssn As String
Public Function GetMaskedSSN() As String
Return "XXX-XX-" & ssn.Substring(ssn.Length - 4)
End Function
Public Sub SetSSN(value As String)
' Add validation if needed
ssn = value
End Sub
End Classスタート35:11
ティムは、プライベート・メソッドは、直接アクセスすべきでない動作をカプセル化するのに役立つと説明します。 彼は、社員のオフボーディングのような大きなプロセスの一部として DeleteUser メソッドの例を使用します。
**悪い例: **
public class UserManager
{
public void DeleteUser(int userId)
{
// Deletes the user without considering related processes
}
}Public Class UserManager
Public Sub DeleteUser(userId As Integer)
' Deletes the user without considering related processes
End Sub
End Class良い例:
public class UserManager
{
public void OffboardUser(int userId)
{
RevokeAccess(userId);
DeleteUser(userId); // Used privately as part of offboarding
}
private void DeleteUser(int userId)
{
// Internal logic to delete the user
}
private void RevokeAccess(int userId)
{
// Logic to revoke system access
}
}Public Class UserManager
Public Sub OffboardUser(userId As Integer)
RevokeAccess(userId)
DeleteUser(userId) ' Used privately as part of offboarding
End Sub
Private Sub DeleteUser(userId As Integer)
' Internal logic to delete the user
End Sub
Private Sub RevokeAccess(userId As Integer)
' Logic to revoke system access
End Sub
End Classアクセス修飾子は、データが適切なバリデーションで設定または取得されるようにすることで、バグを防止します。 ティムは Age プロパティを含む例を使ってこれを説明しています。
**悪い例: **
public class Person
{
public int Age; // Can be directly set to an invalid value
}Public Class Person
Public Age As Integer ' Can be directly set to an invalid value
End Class良い例:
public class Person
{
private int age;
public int Age
{
get { return age; }
set
{
if (value < 0 || value > 120)
throw new ArgumentOutOfRangeException("Age must be between 0 and 120.");
age = value;
}
}
}Public Class Person
Private _age As Integer
Public Property Age As Integer
Get
Return _age
End Get
Set(value As Integer)
If value < 0 OrElse value > 120 Then
Throw New ArgumentOutOfRangeException("Age must be between 0 and 120.")
End If
_age = value
End Set
End Property
End Classアクセス修飾子を適切に使用することで、必要なものだけを公開して開発を簡素化し、混乱を避けることができます。 たとえば、何千ものメソッドがあるアプリケーションでは、パブリックなメソッドだけを公開することで、開発者は関連するオプションだけを見ることができます。
例:
public class MathLibrary
{
public int Add(int a, int b) => a + b;
public int Subtract(int a, int b) => a - b;
private void LogCalculation(string operation, int result)
{
// Logging is internal and not exposed
}
}Public Class MathLibrary
Public Function Add(a As Integer, b As Integer) As Integer
Return a + b
End Function
Public Function Subtract(a As Integer, b As Integer) As Integer
Return a - b
End Function
Private Sub LogCalculation(operation As String, result As Integer)
' Logging is internal and not exposed
End Sub
End Class大規模なプロジェクトの場合、ティムは、アクセス修飾子を適切に使用することで、ライブラリの必要な部分のみを確実に公開し、ライブラリを使用する開発者の認識負荷を軽減する方法を説明します。
例:
public class MathLibrary
{
public int Add(int a, int b) => a + b;
public int Subtract(int a, int b) => a - b;
private void LogCalculation(string operation, int result)
{
// Logging is internal and not exposed
}
}Public Class MathLibrary
Public Function Add(a As Integer, b As Integer) As Integer
Return a + b
End Function
Public Function Subtract(a As Integer, b As Integer) As Integer
Return a - b
End Function
Private Sub LogCalculation(operation As String, result As Integer)
' Logging is internal and not exposed
End Sub
End Classこれらのアクセス修飾語を正しく使用することで、あなたの仕事と次の人の仕事を楽にすることができます。
Tim Coreyは、C#アクセス修飾子をマスターするための明確で実用的なガイドを提供し、安全で保守性の高い、プロフェッショナルなアプリケーションを作成するための効果的な使用方法を示します。 彼の詳細な説明と実例により、あらゆるレベルの開発者がこのトピックにアクセスできるようになっています。
より深い洞察や、これらのコンセプトが実際に使われている様子をご覧になりたい方は、ぜひティムのビデオをフルでご覧ください。また、C# やその他のプログラミング トピックに関する貴重なコンテンツについては、チャンネルをご覧ください。 開発スキルを向上させたいと真剣に考えている人には、必見のリソースです!
Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!
Join our newsletter, you’ll get exclusive access on article updates. We value your privacy