2015-06-20 2 views
-1

У меня есть класс и конструктор для того, чтобы инициировать это следующим образом:членов класса изменять значение

public class Merchant 
{ 
    public int userID; 
    public int clubID; 
    public short categoryID; 
    public string posTerminalID; 
    public string name; 
    public double score; 
    public double subClubSharePercent; 
    public double simClubSharePercent; 
    public bool isActive; 
    public string modificationDatetime; 

    public Merchant() 
    { 

    } 
    public Merchant(int uID, int cID, Int16 aID, string pID, string n, double s, double sSp, double sCp, Boolean iA, DateTime dt) 
    { 
     Date da = new Date(); 

     this.userID = uID; 
     this.clubID = cID; 
     this.categoryID = aID; 
     this.posTerminalID = pID; 
     this.name = n; 
     this.score = s; 
     this.subClubSharePercent = sSp; 
     this.simClubSharePercent = sCp; 
     this.isActive = iA; 
     this.modificationDatetime = da; 
    } 
} 

как я могу изменить значение членов класса:

  1. Используйте метод конструктора снова?
  2. Создать класс модификации и назвать его?

В чем разница между инициализацией класса с помощью конструктора и синтаксиса? спасибо.

+1

Вы просто хотите изменить значения элементов в классе? Определенно не хочу снова вызвать конструктор. Вы должны включить их в свойства, например, 'public bool IsActive {get; задавать; } ', а затем вы можете изменить их через' classInstance.IsActive = true'. – Tom

+1

Ваш вопрос имеет нулевой смысл. Прежде всего, это не настраиваемый конструктор ... это просто конструктор. Просто имеет параметры, которые делают его конструктором, отличным от стандартного. Во-вторых, вы не используете конструкторы для модификации компонентов класса. Вы используете их для создания новых экземпляров объекта. Таким образом, вы хотите только добавить методы к вашему классу, которые вы можете вызвать, чтобы изменить состояние объекта для каждого объекта. –

+0

Я не хочу использовать приемник сеттера. – David

ответ

3

Дэн Филд определенно дал вам адекватный ответ, но я подумал, что я тоже перезвоню с несколькими лакомыми кусочками.

  • Конструкторы полезны для установки переменных, которые разработчик никогда не мог установить. К ним относятся частные поля, частные функции и частные свойства.

  • Вы объявили много открытых полей. Вы знаете, что это поля, потому что нет функции «setter» или «getter». Свойства, однако, определяются с помощью функций getter и setter. Сеттеры и геттеры - это не просто феномен C#, они полезны во многих объектно-ориентированных языках.

  • В C# общедоступные свойства могут быть заданы программистом при необходимости - инициализация открытых свойств через конструктор (за некоторыми исключениями) не всегда полезна. Тем не менее, существуют шаблоны, где требует каждого поля, которое должно быть передано в конструктор, означает, что объект не может существовать без всякой информации. В вашем случае это, по-видимому, не вызывает беспокойства, поскольку у вас есть без параметров конструктор в public Merchant().

  • C# также допускает право инициализации объекта в его синтаксисе без необходимости передавать каждое свойство через параметры в конструкторе.

Рассмотрим разницу здесь:

//Constructor with all parameters 
public Merchant(int uID, int cID, Int16 aID, string pID, string n, double s, double sSp, 
double sCp, Boolean iA, DateTime dt) { 

    Date da = new Date(); 

    this.userID = uID; 
    this.clubID = cID; 
    this.categoryID = aID; 
    this.posTerminalID = pID; 
    this.name = n; 
    this.score = s; 
    this.subClubSharePercent = sSp; 
    this.simClubSharePercent = sCp; 
    this.isActive = iA; 
    this.modificationDatetime = da; 
} 

//Code using it 
Merchant merchant = new Merchant(uID, cID, aID, pID, n, s, sSp, sCp, iA, dt); 

против

//Constructor with no parameters 
public Merchant() { } 

//Code using it 
Merchant merchant = new Merchant() { 
    userID = uID, 
    categoryID = aID, 
    isActive = iA, 
    modificationDateTime = da 
}; 

Основные отличия в том, что с первым методом, вы исполнение все параметры должны присутствовать. Второй способ, однако, дает пользователю большую гибкость для создания экземпляра только того, что они хотят/нуждаются.

2

Вы можете вызвать конструктор класса только один раз. После того, как объект сконструирован, он сконструирован, и это только он (оставляя в стороне любые странные попытки вызвать код в конструкторе посредством отражения).

Если вы хотите иметь возможность использовать один метод для изменения значений класса после его создания, вам придется написать метод для этого (возможно, вы не хотите, чтобы кто-то менял только один переменная-член за один раз? Выполнение проверок против переменных, которые по соображениям безопасности потока вы не запускаете все сразу?).

Если вы не хотите, внешние объекты, чтобы иметь возможность изменять значение класса, вероятно, вы должны сделать эти общественные свойства имеют отдельный набор, например:

public bool isActive { get; private set; } 

Это станет ясно, что свойство может быть прочитано, но не записано вне самого класса, и не допускает модификацию переменной, не являющейся членом.

Если вы хотите, чтобы свойства могли быть установлены только конструктором (и даже метод члена не может их изменить), отметьте их readonly. Но поймите, что для получения новых значений здесь вам нужно будет создать совершенно новый объект (т. Е. new Merchant(param, param, param....).

Смежные вопросы