Start here. This is the direct spoken answer to practice first.
Why this question matters
Access modifiers define who may depend on a member. I expose the smallest surface that supports intended use because every public or protected member becomes harder to change safely.
I expose the smallest access surface that supports the intended callers. Private keeps implementation inside the declaring type. Internal exposes a type or member only within the assembly, which is useful for implementation components that several classes share but consumers should not call. Protected is for a deliberate inheritance contract, while public is for supported consumers rather than merely making tests or wiring convenient.