Например, возьмём так часто упоминаемые properties: имитацию доступа к свойствам объекта через скрытые get/set функции. Такое есть не только в C#, но и, скажем, в Ruby, Scala, Python. В Python, правда, это реализовано достаточно криво, на мой взгляд.
C#
Код: Выделить всё
public class Foo {
private string bar;
public string Bar {
get { return bar; }
set { bar = value; }
}
}
На практике же, использование properties зачастую сводится именно к такому, как показано выше. Разве что с вариациями, когда имеется только read-only или write-only доступ. Для таких случаев как раз Ruby очень грамотно разработан с его attr_reader, attr_writer, etc.. И это правильно. Большего, чем пометить доступ к полю, как read или write-only и не надо было бы.
Удобство компактной нотации, подобной доступу к обычному public field, опять же спорно, особенно, если за property's getters/setter кроется сложная временезатратная логика. Так, скажем, простейший obj.Foo = bar; может превратиться в скрытую пожиралку компьютерных ресурсов, так как от нотации доступа к полю привычно ожидается просто присваивание объекта, а не дополнительная работа помимо этого.
И, вообще, и public доступ к полям, и имитация этого доступа через properties -- это кощунство над объектно-ориентированным программированием. Наглое попрание одной из его основных концепций -- инкапсуляции. Не для того городился весь этот огород с разными уровнями доступа, чтобы так насмехаться над ним.
Так что, мне кажется, Java пока что ещё следует правильным путём. Насколько я знаю, в Java SE 7 даже и не планировалось включать механизм properties.