C#には、これらの提案の実用性を低下させると思われるプロパティがあります。ここで取り上げる重要な点は、クラス内のデータはカプセル化 (外部から直接アクセスできない) し、抽象化 (詳細は隠蔽) する必要があるということです。これは、クラスの主な目的の 1 つです。このため、プロパティを持たない C++ のような言語では、このアドバイスがより理にかなっていると思います。
ただし、問題の 1 つは、プライベート フィールドを持つクラスを作成し、プライベート フィールドごとにゲッター メソッドとセッター メソッドを作成する必要があり、ボイラー プレート コードが冗長になることです。プロパティは、カプセル化と抽象化を維持しながら、この戦略を合理化するのに役立ちます。例えば、
UserInfo user = new UserInfo();
user.Username = "foo";
Console.WriteLine(user.Password);
上記の例では、ユーザー名を foo に設定し、ユーザーのパスワードを取得しました。正確にどのように情報を設定および取得したかは隠されています。今は .xml ファイルに保存されているかもしれませんが、後でデータベースに保存するか、メモリに直接保存するように変更することにしました。このクラスを使用する外部の世界は決して賢明ではありません。これは、OOP の多くの優れた点の 1 つです。
質問の 2 つの箇条書きは、プロパティのゲッターとセッターに対応できます。引数なしでクラスからデータを取得したい場合は、プロパティを持つ方が理にかなっています。同様に、オブジェクトの状態を変更したい場合は、setter プロパティを使用できます。入力に対して検証を実行し、スレッド セーフにし、ログを追加し、1 つの引数を取るメソッドで実行できるすべてのことを行うことができます。