Я собираюсь немного изменить ваш вопрос, чтобы обеспечить лучшее сравнение.В Java обычно есть общедоступные методы получения и частные методы установки, при этом конструктор является инициализатором [sic] переменной, например:
public class Person{
private String fName;
public Person (String name) {
setName(name);
}
private void setName(String someName){
fName = someName;
}
String getName(){
return fName;
}
}
. Пользователь класса может получить значение только послеинициализация через конструктор:
public class Example {
Person person = new Person("Fred");
System.out.println(person.getName()); // Allowed
System.out.println(person.fName); // Not allowed because fName is a local class variable
person.setName("Aaron"); // Not allowed because setName() is a local class method
}
Здесь C # может запутаться, поскольку вместо Person.getName
вы просто используете саму переменную, однако эта переменная может по-прежнему инкапсулироваться,В Java вас учат, что переменные класса должны быть локальными (частными) и доступ к ним должен осуществляться только с помощью методов получения и установки.C # по сути тот же, но синтаксис и логика разные.Переписать мой пример на C # будет следующим:
public class Person {
public String fName {get; private set;}
public Person(String name) {
this.fName = name;
}
}
public class Example {
Person person = new Person("Fred");
Console.WriteLine(person.fName); // This is allowed
person.fName = "Tony"; // Not allowed because setter is private
}
Теперь, если вы хотите добавить логику в ваш метод получения и установки, используя вышеуказанные соглашения, вам нужно будет ввести локальную частную переменную, но код в Example
и ваш конструктор Person не изменится:
class Person {
private String _fName;
public String fName {
get { return _fName + ".addedText"; }
private set { _fName = value.ToLower(); }
}
public Person(String fName) {
this.fName = fName;
}
}
Теперь вопрос о том, лучше это или хуже, чем Java, является спорным, но из того, что я видел, ваш код будет неуместен в C #если вы сделаете что-то похожее на приведенное ниже, хотя синтаксис будет работать:
class Person2 {
private String fName;
public Person2(string fName) {
setFname(fName);
}
private void setFname(String fName) {
this.fName = fName.ToLower();
}
public String getFname() {
return this.fName+ ".addedText";
}
}