【问题标题】:How do define get and set for an array data member?如何为数组数据成员定义 get 和 set?
【发布时间】:2012-03-17 16:57:41
【问题描述】:

我正在创建一个具有以下数据成员和属性的类 Customer

private string customerName;
private double[] 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 double[] TotalPurchasesLastThreeDays
{
?
}

如何定义数组数据成员的get和set?

【问题讨论】:

  • 将购买作为 Customer 类本身的一部分对我来说听起来很奇怪。

标签: c#


【解决方案1】:

你想要indexer吗?

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

因为否则这个问题听起来有点奇怪,因为您已经在代码中实现了一个属性并且显然有能力这样做。

【讨论】:

  • 索引器没有名称,因为您直接索引对象。所以你应该删除Purchases 来编译你的代码。事实上,索引器是这样工作的:myCustomer[index],而不是这样:myCustomer.Purchases[index]
  • 随意编辑。反正我每次都要查语法。
  • 如果我们有两个或更多的数组并且都需要这个呢?
【解决方案2】:

您可以使用自动属性:

public class Customer
{
    public string CustomerName { get; set; }

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

或者如果你愿意:

public class Customer
    {
        private double[] totalPurchasesLastThreeDays; 

        public string CustomerName { get; set; }

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

然后在构造函数中,可以设置一些默认值:

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

【讨论】:

    【解决方案3】:

    您可能会问自己这个问题,因为您认为分配给数组与常规变量不同?

    在这种情况下,您必须意识到,当您调用TotalPurchasesLastThreeDays[3] = 14.0 时,您实际上使用的是getter 而不是setter。 setter 用于更改数组本身,而不是它包含的值。因此,使用数组对 getter 和 setter 进行编码与使用任何其他变量类型没有任何不同。

    【讨论】:

      【解决方案4】:

      如果你想允许这样做:

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

      但不是这个:

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

      仅定义 getter 即:

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

      相反,如果您需要从类外部更改数组实例,只需遵循其他答案即可。

      【讨论】:

        【解决方案5】:

        如果您希望数组可以从外部设置,最方便的是使用自动属性并删除您已经拥有的私有字段:

        public double[] TotalPurchasesLastThreeDays { get; set; }
        

        【讨论】:

          【解决方案6】:

          一种方法是这样,(我假设这样做的目的是使数组在设置后无法再修改):

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

          但是……你真的想这样做吗?像往常一样做同样的事情可能更方便和直观。

          【讨论】:

            【解决方案7】:
            public double[] TotalPurchasesLastThreeDays
            {
            get
            {
                return totalPurchasesLastThreeDays;
            }
            set
            {
                totalPurchasesLastThreeDays = value;
            }
            }
            

            【讨论】:

              【解决方案8】:
              public double[] TotalPurchasesLastThreeDays
              {
               get
              
                {
                  return totalPurchasesLastThreeDays;
                }
              
              set
              
              {
               totalPurchasesLastThreeDays=value;
              }
              }
              

              【讨论】:

                【解决方案9】:
                public int this [int varialbeindex]
                {
                    get
                    {
                        return totalpurchaseslastdays[index];
                    }
                    set
                    {
                        totalpurchaseslastdays[index]=value;
                    }
                }
                

                【讨论】:

                • 这感觉很奇怪,如果这段代码能编译我会很惊讶
                • @Rafalon 将variableIndex 更改为index,它会编译得很好。这是保护底层数组不被更改为其他长度的少数答案之一,以防您想强制执行问题中提到的固定长度 3。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2010-10-23
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2023-01-19
                • 2015-05-11
                相关资源
                最近更新 更多