[问题] 新手想问关于get; set;和阵列

楼主: Moneyyyyy (郑竹)   2019-04-18 17:56:17
我需要先有十个Sale物件
fields需要inventoryNum库存数量、saleAmount销售额、taxOwed所欠的税
皆由使用者输入
当销售额使用set存取器设定好后,taxOwed也被计算出来
(销售额低于100税率是0.08,大于一百超出额是0.06)
所以我写了如下的程式码
Main method 里面
{
Sale[] sales = new Sale[10];
for (int i = 0; i < sales.Length; i++)
{
sales[i] = new Sale();
sales[i].InventoryNum = ReadLine();
sales[i].SaleAmount = ReadLine();
}
}
然后class中长这样
{
private int inventoryNum; //库存数量
private double saleAmount; //销售额
private double taxOwed;
public double SaleAmount
{
get { return saleAmount; }
set
{
saleAmount = value;
if (saleAmount <= 100)
{
taxOwed = 0.08 * saleAmount;
}
else
{
taxOwed = 0.08 * 100 + 0.06 * (saleAmount - 100);
}
}
}
}
其他部分没有详细写出来,这样是可以跑的
1. 想问一般情况大家会在set里面写两行以上的程式码吗?(我知道官方建议是一行
2. 会有什么缺点吗?
然后延伸部分是,当我今天要使用c#内建的排序方法去将销售额排出顺序时
会出现问题,因为Array.Sort(这边必须放阵列)
但是我的sales[0].taxOwed和sales[1].taxOwed和其他的taxOwed并不是一整个阵列
所以我将原本建立Sales物件阵列(如上面叙述的程式),改成
Sale sales = new Sale(10); (并且让fiels都是阵列)
class中的程式码长这样
{
private int[] inventoryNum; //库存数量
private double[] saleAmount; //销售额
private double[] taxOwed;
public Sale(int size)
{
inventoryNum = new int[size];
saleAmount = new double[size];
taxOwed = new double[size];
}
public int[] InventoryNum
{
get { return inventoryNum; }
set { inventoryNum = value; }
}
public double[] SaleAmount
{
get { return saleAmount; }
set
{
saleAmount = value;
for (int i = 0; i < 10; i++)
{
if (saleAmount[i] <= 100)
{
taxOwed[i] = 0.08 * saleAmount[i];
}
else
{
taxOwed[i] = 0.08 * 100 + 0.06 * (saleAmount[i] - 100)
;
}
}
}
}
}
但是这样的程式码存入销售额的时候,并不会去计算taxOwed
推测是set中不会进入for循环
想请问
3.是不是只能另外写一个calc method去计算,然后在main method里面呼叫?
4.关于这两种阵列的写法
Sale[] sales = new Sale[10]; //第一种:物件是阵列
Sale sales = new Sale(10); //第二种:实际上是fields是阵列
有没有什么差别?或是使用时机?优缺点等等
如果对内容有建议,麻烦鞭小力一点
谢谢各位大大
作者: s4300026 (s4300026)   2019-04-18 19:16:00
1.官方没有建议只能一行吧? set的用意是有些变量在存盘前要预先处理,如果直接呼叫变量,则会有漏处理的情况
作者: jass970991 (半糖绿假面超人)   2019-04-18 21:35:00
你这样写啊不哪天class传到其他地方 又决定修改这个class 就越变越大坨 为什么不好好的处理完再传进去那我会把他们两个用tuple 或另设一个class来readonly, 当你要设定一个值的时候会强迫另外一个也要赋值同时做好一个calculator, 只要输入 amount 自动产生一组可以直接用的tax amount pair把ds和逻辑分开真的非常重要
楼主: Moneyyyyy (郑竹)   2019-04-18 22:37:00
喔喔,学到一课,谢谢,我来查查tuple是什么~
作者: wezmag (wezmag)   2019-04-19 19:28:00
有个严重的缺点,钱请用decimal,用double会出问题
作者: forewero (木日一)   2019-04-20 10:51:00
我自己写除了默认值以外不会在model 做事,不是不行,但不直观;权责没分清后续接手很痛苦
作者: Litfal (Litfal)   2019-04-20 11:43:00
当你的属性值只和class内的资料相关时,就可以写在model里而你的税务计算听起来就很专业XD, 又有8%,100,6%这种与类无关的魔术数字,建议另外拉一个Service或Helper class算
作者: vi000246 (Vi)   2019-04-21 23:40:00
如果只是amount = salse x price之类简单的逻辑可以写在set或get里 复杂一点的算式就不建议了

Links booklink

Contact Us: admin [ a t ] ucptt.com