【问题标题】:PV Function and Porting VB6 to C#PV 函数和将 VB6 移植到 C#
【发布时间】:2009-09-24 14:06:54
【问题描述】:

我正在将一些经典的 VB6 代码移植到 C# 中,但偶然发现了 PV 函数的用法。

我感觉不对,包括对 Microsoft.VisualBasic 程序集的引用。这是通常做的事情,还是我应该探索更多的选择。我想到的下一个想法是在 Reflector 中探索这个 PV 函数。

【问题讨论】:

    标签: c# vb.net vb6 vb6-migration


    【解决方案1】:

    在 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 实现一个完全正常工作的端口。

    【讨论】:

    • 100% 同意这一点。这种不情愿使用微软支持的库从何而来?仅仅是“eww...它说VB”的心态吗?怎么回事? Microsoft 编写了 VB6、C#,然后(免费)提供了 Microsoft.VisualBasic 命名空间,仅用于此目的。仍然有人犹豫使用它。无论如何——抓住机会选择其他一些“非 VB,因此更好”的选项。
    • 只是补充一点:归根结底,这都是 IL。我可以用 C#、Visual Basic.NET、IronPython 和 Boo 编写东西,然后将它们全部放入 Blender (=compilers) 并检索以前不知道它是什么的 IL。
    • 在 C# 开发人员中使用 VB 是一种耻辱,因此他们不喜欢 VisualBasic 的名称,因为他们认为他们正在使用 VB 进行编程。也许 MS 应该将其重命名为 Microsoft.ReallyUsefulAndFullySupportedFunctions,每个人都会很高兴
    【解决方案2】:

    在 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 的重新排列。

    【讨论】:

    • 这几乎是微软公式的重新排列,除了 rate=0 时。那是您的版本除以零的时候,VB6 和 Microsoft.VisualBasic 返回-fv -(pmt*nper)。即使从网页编写公式也存在缺陷。这加强了我的回答 - 可惜只是使用 Microsoft.VisualBasic 并继续为可怜的老用户实现其他功能。
    【解决方案3】:

    你可以使用这个库来复制 f# 中的 excel 函数

    Library

    它有现值的PV。我用过一次或两次。只需将其放入并添加参考即可。

    【讨论】:

    • hmmm 依赖 CTP 语言似乎有点冒险,但我认为我宁愿这样做也不愿参考 Microsoft.VisualBasic 库
    • 没错,我用的时候就是为了避免excel自动化和引用Excel
    • “NotStandAlone”版本几乎是 1 兆...几乎想从 Reflector 中获取 PV 功能,但我会试一试
    • 我更喜欢 JDunkerley 的解决方案 - 我宁愿在我的代码中添加一个 2 行函数,而不是引用整个程序集。
    • @Dave - -2 ( -1 因为我不同意,另一个 -1 因为我是个无能的菜鸟,不小心点赞了你的评论,而且无法撤消。Doh! ;-) 说真的,VB 库中有一些好东西(例如,形状)。我认为因为反VB势利而不占优势是短视的。
    【解决方案4】:

    我尝试使用已接受的答案,但无法在 .NET Core 中使用。我环顾四周,在 github 上遇到了这段代码,这似乎是微软的 PV 实现:

    https://github.com/microsoft/referencesource/blob/master/Microsoft.VisualBasic/runtime/msvbalib/Financial.vb#L662

        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#。如果我在本文末尾有一个足够通用的实现,我也会发布。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多