If you’re class library developer developing types that will be used by other developers, you have a huge responsibility.
You’re trying to design the types which will be used by wide variety of applications. Remember that you don’t know which code is calling you. It’s not feasible to anticipate every situation in which your type will be used, so every public class, method or whatever you have in code makes the contract which means:
– lot of external code lines invoking that
– the need backward compatibility
– validation for any invalid input
– the need for documentation
– and even more
To simplify, that just means the public keyword is producing the cost. If you could deliver the same functionality with smaller cost (less public keywords in your code), then it is better for you…