【问题标题】:Getting a lot of variables from one method to another C#从一种方法获取大量变量到另一种 C#
【发布时间】:2014-01-08 20:40:55
【问题描述】:

我遇到了这个问题。假设我们有大约 20 个变量,每个变量都有其他值(它们都是小数),现在我想尽快从一种方法到另一种方法。实现我的目标的最快方法是什么? 这是一些代码:

private void button2_Click(object sender, EventArgs e)
{
  decimal WStoneCost = (PriceMethod.StoneCost * AP) / 100;
  decimal WWoodCost = (PriceMethod.WoodCost  *AP)/100;
  decimal WMetalCost = (PriceMethod.MetalCost  *AP)/100;
  decimal WSteelCost = (PriceMethod.SteelCost  *AP)/100;
  decimal WPaperCost = (PriceMethod.PaperCost  *AP)/100;
  decimal WPotatoeCost = (PriceMethod.PotatoeCost  *AP)/100;
  decimal WTomatoeCost = (PriceMethod.TomatoeCost  *AP)/100;
  decimal WCucumberCost = (PriceMethod.CucumberCost  *AP)/100;
  decimal WCornCost = (PriceMethod.CornCost  *AP)/100;
  decimal WFlourCost = (PriceMethod.FlourCost  *AP)/100;
  decimal WBreadCost = (PriceMethod.BreadCost  *AP)/100;
  decimal WSwordsCost = (PriceMethod.SwordsCost  *AP)/100;
  decimal WShieldsCost = (PriceMethod.ShieldsCost  *AP)/100;
  decimal WCannonsCost = (PriceMethod.CannonsCost  *AP)/100;
  decimal WRiflesCost = (PriceMethod.RiflesCost  *AP)/100;
  decimal WBulletsCost = (PriceMethod.BulletsCost  *AP)/100;
  decimal WCowCost = (PriceMethod.CowCost  *AP)/100;
  decimal WhorseCost = (PriceMethod.horseCost  *AP)/100;
  decimal WSheepCost = (PriceMethod.SheepCost  *AP)/100;
  decimal WChickenCost  = (PriceMethod.ChickenCost *AP)/100;
  decimal WPigCost = (PriceMethod.PigCost * AP) / 100;
}

我想将这些小数分别移动到不同的方法,例如:

private void StoneBuy_Click(object sender, EventArgs e)
{
}

那么最有效的方法是什么?提前致谢。

【问题讨论】:

  • 为什么不创建一个类来保存这些值,创建类的实例并分配值,然后将该对象传递给方法?
  • 复制和粘贴效果很好。
  • 例如 WStoneCost 我需要在私人 void StoneBuy... 以此类推
  • 您想将所有 20 个小数移到一个只与其中一个(WStoneCost)有关的事件中吗?为什么?作为旁注,这里有严重的代码气味。几乎可以肯定,有更好的方法来做你想做的事。
  • 代码似乎是关于编写代码的最佳方式,并且在 codereview.stackexchange.com 上会更好

标签: c# variables methods decimal


【解决方案1】:

创建一个包含所有属性的类

public class MyClass
{
    decimal WStoneCost = (PriceMethod.StoneCost * AP) / 100;
    decimal WWoodCost = (PriceMethod.WoodCost  *AP)/100;
    decimal WMetalCost = (PriceMethod.MetalCost  *AP)/100;
    decimal WSteelCost = (PriceMethod.SteelCost  *AP)/100;
    decimal WPaperCost = (PriceMethod.PaperCost  *AP)/100;
    decimal WPotatoeCost = (PriceMethod.PotatoeCost  *AP)/100;
    decimal WTomatoeCost = (PriceMethod.TomatoeCost  *AP)/100;
    decimal WCucumberCost = (PriceMethod.CucumberCost  *AP)/100;
    decimal WCornCost = (PriceMethod.CornCost  *AP)/100;
    decimal WFlourCost = (PriceMethod.FlourCost  *AP)/100;
    decimal WBreadCost = (PriceMethod.BreadCost  *AP)/100;
    decimal WSwordsCost = (PriceMethod.SwordsCost  *AP)/100;
    decimal WShieldsCost = (PriceMethod.ShieldsCost  *AP)/100;
    decimal WCannonsCost = (PriceMethod.CannonsCost  *AP)/100;
    decimal WRiflesCost = (PriceMethod.RiflesCost  *AP)/100;
    decimal WBulletsCost = (PriceMethod.BulletsCost  *AP)/100;
    decimal WCowCost = (PriceMethod.CowCost  *AP)/100;
    decimal WhorseCost = (PriceMethod.horseCost  *AP)/100;
    decimal WSheepCost = (PriceMethod.SheepCost  *AP)/100;
    decimal WChickenCost  = (PriceMethod.ChickenCost *AP)/100;
    decimal WPigCost = (PriceMethod.PigCost * AP) / 100;
}

让它成为你的事件的类中的一个属性:

public class Whatever
{
    public MyClass Mine;

    public Whatever()
    {
        Mine = new MyClass();
    }

    private void button2_Click(object sender, EventArgs e)
    {
         Mine.WStoneCost = (PriceMethod.StoneCost * AP) / 100;
         //etc
    }

    private void StoneBuy_Click(object sender, EventArgs e)
    {
        //Use it here somehow
    }
}

【讨论】:

  • 谢谢,但在这种情况下,要么我应该从一个类/方法导入很多到另一个类/方法我的意思是像这些小数所需的随机数(因为我必须重新运行随机生成但保留这些成本。)这就是为什么我一开始不想这样做。
  • 我不明白你为什么要计算WStoneCost 两次?为什么
  • 按下一个按钮后,每日价格会发生变化,从而生成两个随机数,每个随机数只产生价格的百分比,然后将所有其他百分比来源放在一起,从而产生价格。
  • 我应该如何访问诸如事件处理程序之类的东西,例如在类中单击相同的按钮? (对不起,我是新手)
【解决方案2】:

如果你想一起处理这些变量,听起来就像它们属于一起。如果它们属于一起,并且您想对它们进行整体操作。这听起来完全像是你应该在那里上课。也许您应该将所有这些数据放在一个类中,因此您只需在方法之间“移动”时传递对它的引用。

如果你想要最快的方式,写它是汇编编程语言。如果你想要一个可维护的程序,一个易于阅读的代码库,你应该根据 OO 原则来构建你的代码,而不仅仅是 ad-hoc。

请参阅 Dave Zych 的解决方案,了解可能的方法。

【讨论】:

  • write it is assembly programming language ?你是认真的吗?
  • “我想尽快得到它” - 开玩笑 :-)
【解决方案3】:

我会使用字典:

// Note: assuming that PriceMethod is an enum.
var costs = Dictionary<PriceMethod, decimal>();
foreach (PriceMethod priceMethod in (PriceMethod[])Enum.GetValues(typeof(PriceMethod)))
{
    // Assuming AP is a decimal, since if it's an int there might be rounding issues.
    costs[priceMethod] = ((int)priceMethod * AP) / 100;
}

然后您可以将字典保留为私有字段,以便在您想要的任何类方法中使用。另外,如果你添加一个新的PriceMethod,你只需要将新值添加到PriceMethodenum,上面的循环就会把它捡起来。不要在多个地方输入相同的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 2017-09-09
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    相关资源
    最近更新 更多