作者Moneyyyyy (挡我者死)
看板C_Sharp
标题[问题] 新手想问关於get; set;和阵列
时间Thu Apr 18 17:56:17 2019
我需要先有十个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是阵列
有没有什麽差别?或是使用时机?优缺点等等
如果对内容有建议,麻烦鞭小力一点
谢谢各位大大
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 49.197.94.181
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_Sharp/M.1555581380.A.05B.html
1F:推 s4300026: 1.官方没有建议只能一行吧? set的用意是有些变数在存04/18 19:16
2F:→ s4300026: 档前要预先处理,如果直接呼叫变数,则会有漏处理的情况04/18 19:16
已经回覆在下一篇
3F:推 jass970991: 你这样写啊不哪天class传到其他地方 又决定修改这个cl04/18 21:35
4F:→ jass970991: ass 就越变越大坨 为什麽不好好的处理完再传进去04/18 21:35
因为原本他这样写
The tax should be calculated whenever
the amount of the sale is set.
可能是我理解有误,因为我原本以为要在设定好销售额的同时就设定好taxowed,不能自
己
另外呼叫method这样,所以才想说可不可以直接放在set里
※ 编辑: Moneyyyyy (49.197.94.181), 04/18/2019 22:01:01
5F:推 jass970991: 那我会把他们两个用tuple 或另设一个class来readonly04/18 22:07
6F:→ jass970991: , 当你要设定一个值的时候会强迫另外一个也要赋值04/18 22:07
7F:→ jass970991: 同时做好一个calculator, 只要输入 amount 自动产生04/18 22:07
8F:→ jass970991: 一组可以直接用的tax amount pair04/18 22:07
9F:→ jass970991: 把ds和逻辑分开真的非常重要04/18 22:08
10F:→ Moneyyyyy: 喔喔,学到一课,谢谢,我来查查tuple是什麽~04/18 22:37
11F:推 wezmag: 有个严重的缺点,钱请用decimal,用double会出问题04/19 19:28
已修正,谢谢
12F:→ forewero: 我自己写除了预设值以外不会在model 做事,不是不行,但04/20 10:51
13F:→ forewero: 不直观;权责没分清後续接手很痛苦04/20 10:51
14F:推 Litfal: 当你的属性值只和class内的资料相关时,就可以写在model里 04/20 11:43
15F:→ Litfal: 而你的税务计算听起来就很专业XD, 又有8%,100,6%这种与类04/20 11:47
16F:→ Litfal: 无关的魔术数字,建议另外拉一个Service或Helper class算04/20 11:47
请问,所谓的 model 是指getter, setter吗?
17F:推 vi000246: 如果只是amount = salse x price之类简单的逻辑04/21 23:40
18F:→ vi000246: 可以写在set或get里 复杂一点的算式就不建议了04/21 23:40
谢谢各位大大的建议
※ 编辑: Moneyyyyy (49.197.94.181), 04/22/2019 21:16:13