我遇到了转换少量代码的困难。如果我能得到一些指导,那就太好了。代码当前为 C 格式,我正在尝试转换为 C#。
typedef struct sched_pmt *sched_pmt_ptr;
typedef struct sched_pmt
{
unsigned period_num;
double interest;
double principal;
double advanced_pmt;
double total_pmt;
double balance;
}
sched_pmt;
我想我在下面得到了sched_pmt,但不确定如何做指针。
public class sched_pmt
{
private uint period_num { get; set; }
double interest { get; set; }
double principal { get; set; }
double advanced_pmt { get; set; }
double total_pmt { get; set; }
double balance { get; set; }
}
运行中的 C 代码示例。
sched_pmt_ptr pmtsched = NULL;
pmtsched->period_num = s++;
pmtsched->interest = pmt_int;
pmtsched->principal = prin;
pmtsched->advanced_pmt = adv_pmt;
pmtsched->total_pmt = pmt + adv_pmt;
pmtsched->balance = pv;
pmtsched++;
我可以使用 pmtsched++ 在 C# 中以相同的方式更新结构吗?
我建议你用c#编写它,不要只是转换它,因为不同的语言遵循不同的做事方式。我的意思是以面向对象的方式编写它(可能不适合此代码),但它将有助于可扩展性、灵活性等。
如果您的目标是在 c# 中获得相同的功能,而不仅仅是转换,那么一切都变得容易了。
顺便说一句,对你的问题的回答是肯定的,C#在不安全的上下文中支持指针;如果你想要的话,你可以使用它们。
看起来您正在使用指针算术
来- 循环访问现有结构的列表,或
- 创建一个新的结构列表。
这是有效的 C。但是,尽管可以在unsafe
上下文中使用 C# 中的指针,但这很少是必需的或好主意。略有不同的方式:
要创建新sched_pmt
集合,请执行以下操作:
List<sched_pmt> payments = new List<sched_pmt>();
for(int i = 0; i < numberToCreate; i++)
{
sched_pmt pmt = new sched_pmt();
pmt.period_number = s++;
pmt.interest = pmt_int;
pmt.principal = prin;
pmt.advanced_pmt = adv_pmt;
pmt.total_pmt = pmt + adv_pmt;
pmt.balance = pv;
payments.add(pmt);
}
稍后,要循环访问列表,请执行以下操作:
foreach(var pmt in payments)
{
/// do something with this pmt.
}
或者,只需使用for
循环。它稍微啰嗦一些,但也(非常)稍微更有效率。
或者,如果您已经拥有列表并且只想更新其中的对象,
for(int i = 0; i < payments.Count; i++)
{
sched_pmt pmt = payments[i];
pmt.period_number = s++;
pmt.interest = pmt_int;
pmt.principal = prin;
pmt.advanced_pmt = adv_pmt;
pmt.total_pmt = pmt + adv_pmt;
pmt.balance = pv;
}
我想到的另一个问题:如何创建初始集合,在您的示例中,您尝试通过增加指针来循环访问?如果它在数组中,你很可能做错了。
看起来您的 C 代码正在使用指针(不安全地)在数组或类似的数据结构中移动。如果是这样的话,为什么不干脆做
foreach(sched_pmt pmt in pmtList)
{
pmt.period_num = s++;
pmt.interest = pmt_int;
pmt.principal = prin;
pmt.advanced_pmt = adv_pmt;
pmt.total_pmt = pmt + adv_pmt;
pmt.balance = pv;
}
更好的是,你可以创建一个函数来获取所有参数(s、pmt_int等)并相应地更新 pmt。这样你就可以写
foreach(sched_pmt pmt in pmtList)
{
pmt.Update(//params go here);
}