Как определить get и установить для элемента данных массива?

Я создаю класс Customer, который имеет следующие элементы и свойства данных:

private string customerName;
private ******[] totalPurchasesLastThreeDays; //array of 3 elements that will hold the totals of how much the customer purchased for the past three days i.e. element[0] = 100, element[1] = 50, element[2] = 250
public string CustomerName
{
get { return customerName; }
set { customerName = value; }
}
public ******[] TotalPurchasesLastThreeDays
{
?
}

Как определить get и установить для элемента данных массива?

8 ответов

Вы можете использовать свойство auto-property:

public class Customer
{
 public string CustomerName { get; set; }
 public ******[] TotalPurchasesLastThreeDays { get; set; }
}

Или если вы хотите:

public class Customer
 {
 private ******[] totalPurchasesLastThreeDays; 
 public string CustomerName { get; set; }
 public ******[] TotalPurchasesLastThreeDays
 {
 get
 {
 return totalPurchasesLastThreeDays;
 }
 set
 {
 totalPurchasesLastThreeDays = value;
 }
 }
 }

И затем в конструкторе вы можете установить некоторые значения по умолчанию:

public Customer()
{
 totalPurchasesLastThreeDays = new ******[] { 100, 50, 250 };
}


Вы хотите indexer?

public ****** this[int i] {
 get { return totalPurchasesLastThreeDays[i]; }
 set { totalPurchasesLastThreeDays[i] = value; }
}

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


Один из способов был бы таким, (я предполагаю, что это так, что массив не может быть изменен после настройки):

public ******[] TotalPurchasesLastThreeDays
{
 get {
 return totalPurchasesLastThreeDays;
 }
 set {
 totalPurchasesLastThreeDays = (******[])value.Clone();
 }
}

Но... ты действительно хочешь это сделать? Возможно, более удобно и интуитивно просто делать то же, что и вы, обычно.


Если вы хотите, чтобы массив мог быть установлен снаружи в любом случае, наиболее удобным является использование свойства auto и просто удаление частного поля, которое у вас уже есть:

public ******[] TotalPurchasesLastThreeDays { get; set; }


Если вы хотите разрешить это:

myCustomer.TotalPurchasesLastThreeDays[2] = 3.1415;
var foo = myCustomer.TotalPurchasesLastThreeDays[1];

но не это:

myCustomer.TotalPurchasesLastThreeDays = new Customer[]{ ... };

Определите только геттер, то есть:

public ******[] TotalPurchasesLastThreeDays 
{
 get { return this.totalPurchasesLastThreeDays; }
}

Вместо этого, если вам нужно изменить экземпляр массива вне класса, просто следуйте другим ответам.


public ******[] TotalPurchasesLastThreeDays
{
 get
 {
 return totalPurchasesLastThreeDays;
 }
set
{
 totalPurchasesLastThreeDays=value;
}
}


public ******[] TotalPurchasesLastThreeDays
{
get
{
 return totalPurchasesLastThreeDays;
}
set
{
 totalPurchasesLastThreeDays = value;
}
}


Возможно, вы задаете себе этот вопрос, потому что считаете, что назначение вашего массива отличается от регулярной переменной?

В этом случае вы должны понимать, что когда вы вызываете TotalPurchasesLastThreeDays[3] = 14.0, вы на самом деле используете геттер, а не сеттер. Сеттер используется для изменения самого массива, а не значений, которые он содержит. Поэтому кодирование геттера и сеттера не отличается от массива, чем с любым другим типом переменной.

licensed under cc by-sa 3.0 with attribution.