C#初始化带有不完整参数的结构+;公式

C#初始化带有不完整参数的结构+;公式,c#,constructor,struct,C#,Constructor,Struct,我相信这很简单,但我已经看了太久,我需要一个答案很快。我是C#的新手。如果我把佣金 在我得到的结构中 错误CS0188:在将“this”对象的所有字段分配给之前,无法使用该对象 结构之外 错误CS0038:无法通过嵌套类型“Ex5.\u 3.CommissionForm.SalesorConfigures”访问外部类型“Ex5.\u 3.CommissionForm”的非静态成员 我该怎么做?警告:任务的一部分是佣金的计算方法。我发现的结构教程中没有一个是基于另一个成员的值来指定一个成员的。它应

我相信这很简单,但我已经看了太久,我需要一个答案很快。我是C#的新手。如果我把佣金 在我得到的结构中

错误CS0188:在将“this”对象的所有字段分配给之前,无法使用该对象

结构之外

错误CS0038:无法通过嵌套类型“Ex5.\u 3.CommissionForm.SalesorConfigures”访问外部类型“Ex5.\u 3.CommissionForm”的非静态成员

我该怎么做?警告:任务的一部分是佣金的计算方法。我发现的结构教程中没有一个是基于另一个成员的值来指定一个成员的。它应该是洁净的,因为计算只使用静态数据。对吧?

// Declare class variables and constants
private const decimal WEEKLY_BASE_SALARY = 250m;
private const decimal WEEKLY_QUOTA = 1000m;
private const decimal COMMISSION_RATE = .15m;

public struct salespersonFigures
{
    // Fields
    private string salesperson;
    private decimal weeklySales;
    private decimal commission;
    private decimal pay;

    // Constructor
    public salespersonFigures(string name, decimal sales)
    {
        salesperson = name;
        weeklySales = sales;
        commission = GetCommission(sales);  // error occurs at this line
        pay = WEEKLY_BASE_SALARY + commission;
    }

    // Property

    public decimal Sales
    {
        get
        {
            return weeklySales;
        }
        set
        {
            weeklySales = value;
        }
    }

    public string Name
    {
        get
        {
            return salesperson;
        }
        set
        {
            salesperson = value;
        }
    }

    // Method

    public decimal GetCommission(decimal sales)
    {
        if (sales > WEEKLY_QUOTA)
            return sales * COMMISSION_RATE;
        else return 0m;
    }
}
建造商:

// Constructor
public salespersonFigures(string name, decimal sales)
{
    salesperson = name;
    weeklySales = sales;
    commission = GetCommission(sales);
    pay = WEEKLY_BASE_SALARY + commission;
}
被解释为:

// Constructor
public salespersonFigures(string name, decimal sales)
{
    this.salesperson = name;
    this.weeklySales = sales;
    this.commission = this.GetCommission(sales);
    this.pay = WEEKLY_BASE_SALARY + this.commission;
}
因此,您可能遇到的问题可以通过做两件事来解决:

// Constructor
public salespersonFigures(string name, decimal sales)
{
    salesperson = name;
    weeklySales = sales;
    var tempCommission = GetCommission(sales);
    commission = tempCommission
    pay = WEEKLY_BASE_SALARY + tempCommission;
}

并将GetCommission方法设置为静态

您真的需要Commission字段吗

private decimal commission;

您可以删除它,并在结构中使用方法。我认为在yout
getcommission
方法中不需要销售参数。

非常简单的解决方法/破解:

public salespersonFigures(string name, decimal sales)
{
      salesperson = name;
      weeklySales = sales;
      // initialize pay and commission
      pay = 0m;
      commission = 0m;
      commission = GetCommission(sales);
      pay = WEEKLY_BASE SALARY + commission;
}
您不需要getCommission中子句的
else
部分,只需执行以下操作:

public decimal GetCommission(decimal sales)
{
    if (sales > WEEKLY_QUOTA)
        return sales*COMMISSION_RATE;
    return 0m;
}

还有一件事,为什么要使用
decimal
?您可能应该改用
double
float
,因为更多的方法依赖于
float
double
,在两者之间转换可能代价高昂

为什么不将GetCommission()转换为属性:Commission


不需要将佣金存储为字段,它应该是针对SalesorConfigures对象的查询

为什么它必须是一个结构?这似乎是我要为他创建一个类……他说,他可能是C语言初学者,可能来自C/C++背景,似乎结构是数据结构的逻辑选择,也许这不是一个好的理由,但我们还没有达到书中的这一部分。也许我应该将该方法命名为CalculateCommission(),因为它真正做的是根据传递给它的销售参数计算佣金。因此sales参数是绝对必要的,因为此方法也将用于struct以外的数据。我选择包含在结构中的字段表示我稍后将以各种方式使用的数据。我想现在执行计算并无限期地存储结果,而不是将处理推迟到查看结果,此时,某些常量可能已更改。您可以使用结构中已有的sales字段而不是参数。这将使表单上的另一个事件处理程序无法使用该方法,从而允许销售人员查看如果他们进行了给定级别的销售,他们的佣金将是多少。也不能解决我的问题。非常感谢你,麦凯。我忘了,当我将GetCommission()移到结构外部时,我必须告诉它GetCommission()属于哪个对象。看到我的代码是如何解释的,这非常有帮助。我在程序中更改了这些行:/n var tempCommission=CommissionForm.GetCommission(sales);佣金=临时佣金/n提示Intelissense提供创建存根方法,结果是:内部静态decimal GetCommission(decimal sales){if(sales>WEEKLY_QUOTA)return sales*COMMISSION_RATE;else return 0m;throw new NotImplementedException();}你能解释一下为什么这个方法需要是静态的吗?更改了什么?静态成员不需要使用对象的实例。但这也意味着他们不能访问实例的成员。C#有一个条件:“this”对象在其所有字段都指定给之前不能使用”,以防止您在结构准备就绪之前使用它。这回答了你的问题吗?这并不能真正解决我的问题。不过谢谢你的努力。我发现省略else也可以,但是它会提高性能吗?我觉得else提高了代码的可读性,但是如果它是一个优化,我将在将来的情况下忽略它。在处理货币时,我使用十进制是因为它的精确性质和更好的格式选项。这样做是我的老师和课本推荐的。我意识到它在内存中的成本,它不需要转换到其他类型。如果方法留在结构内部,您编辑的解决方案可能会起作用,但我选择将其留在结构外部。不,据我所知,这不是性能问题,而是风格问题。如果您打算使用
else
子句,那么将
return 0m
放在新行上,我认为这会使它看起来更好。。。小数点的事情我不知道你只是用它来表示货币,是的,小数点在算术运算中有更高的精度…小数比双精度和浮点更好,因为它们提供了更好的精度。是的,有些方法不支持它们,但实际上只支持那些不需要精确性的方法。正如我在前面的评论中提到的,佣金需要存储,因为它代表在给定时间点将支付的金额。如果在未来某个日期,每周定额、佣金率或支付期的常数发生变化,则以前支付佣金的所有记录都将丢失。