【发布时间】:2009-09-24 14:06:54
【问题描述】:
我正在将一些经典的 VB6 代码移植到 C# 中,但偶然发现了 PV 函数的用法。
我感觉不对,包括对 Microsoft.VisualBasic 程序集的引用。这是通常做的事情,还是我应该探索更多的选择。我想到的下一个想法是在 Reflector 中探索这个 PV 函数。
【问题讨论】:
标签: c# vb.net vb6 vb6-migration
我正在将一些经典的 VB6 代码移植到 C# 中,但偶然发现了 PV 函数的用法。
我感觉不对,包括对 Microsoft.VisualBasic 程序集的引用。这是通常做的事情,还是我应该探索更多的选择。我想到的下一个想法是在 Reflector 中探索这个 PV 函数。
【问题讨论】:
标签: c# vb.net vb6 vb6-migration
在 C# 和 VB.NET 中使用 Microsoft.VisualBasic 已在 this question 下进行了深入讨论。 Microsoft.VisualBasic 命名空间是 fully supported,只要 .Net 存在,它就会存在。没有理由避免它。
编辑: 说明在打字时,这个问题的其他答案是不正确重新实现该功能,并且不支持单人乐队代码库中的库。来吧伙计们,微软需要一个真正的major event 才能从 VB 中删除财务功能。
Microsoft.VisualBasic.Compatibility 是另一回事,它专门供 VB6 升级向导使用,EDIT 现在已在 . Net 4(我的预言成真了),不应该用于新的开发。删除对此的引用会有一些优势,但我个人可能会尝试首先引用.Net 3.5 实现一个完全正常工作的端口。
【讨论】:
Microsoft.ReallyUsefulAndFullySupportedFunctions,每个人都会很高兴
在 C# 中复制非常简单
public static double PV(double Rate, int nPer, double Pmt, double FV, bool Type)
{
double ann = Math.Pow(1 + Rate, nPer);
return -(FV + Pmt * (1 + (Type ? Rate : 0)) * ((ann - 1) / Rate)) / ann;
}
只是对公式 Microsoft provides 的重新排列。
【讨论】:
-fv -(pmt*nper)。即使从网页编写公式也存在缺陷。这加强了我的回答 - 可惜只是使用 Microsoft.VisualBasic 并继续为可怜的老用户实现其他功能。
【讨论】:
我尝试使用已接受的答案,但无法在 .NET Core 中使用。我环顾四周,在 github 上遇到了这段代码,这似乎是微软的 PV 实现:
Public Function PV(ByVal Rate As Double, ByVal NPer As Double, ByVal Pmt As Double, Optional ByVal FV As Double = 0, Optional ByVal Due As DueDate = DueDate.EndOfPeriod) As Double
Dim dTemp As Double
Dim dTemp2 As Double
Dim dTemp3 As Double
If Rate = 0.0# Then
Return (-FV - Pmt * NPer)
Else
If Due <> 0 Then
dTemp = 1.0# + Rate
Else
dTemp = 1.0#
End If
dTemp3 = 1.0# + Rate
' WARSI Using the exponent operator for pow(..) in C code of PV. Still got
' to make sure that they (pow and ^) are same for all conditions
dTemp2 = dTemp3 ^ NPer
'Do divides before multiplies to avoid OverFlowExceptions
Return (-(FV + Pmt * dTemp * ((dTemp2 - 1.0#) / Rate)) / dTemp2)
End If
End Function
您仍然需要将其转换为 C#。如果我在本文末尾有一个足够通用的实现,我也会发布。
【讨论】: