【问题标题】:C# functions with static data具有静态数据的 C# 函数
【发布时间】:2008-10-01 13:21:44
【问题描述】:

在 VB.Net 中,我可以将函数中的变量声明为静态,如下所示:

Function EncodeForXml(ByVal data As String) As String
    Static badAmpersand As Regex = new Regex("&(?![a-zA-Z]{2,6};|#[0-9]{2,4};)")

    data = badAmpersand.Replace(data, "&")

    ''// more processing

    return data
End Function

请注意,我需要使用关键字Static,而不是Shared,这是在VB.Net 中表达这一点的正常方式。我怎样才能在 C# 中做到这一点?我找不到它的等价物。

【问题讨论】:

    标签: c# .net vb.net


    【解决方案1】:

    哈!在发布问题时,我找到了答案!与其在谷歌上搜索 C#,我应该一直在寻找有关 VB.Net 如何实现它的详细信息,然后输入这个问题,这对我来说很明显。应用该见解后,我发现:
    http://weblogs.asp.net/psteele/articles/7717.aspx

    那篇文章解释说,CLR 并不真正支持它,VB 编译器在方法的类中“在后台”创建了一个静态(共享)变量。要在 C# 中做同样的事情,我必须自己创建变量。

    不仅如此,它还使用Monitor 类来确保静态成员也是线程安全的。不错。

    附带说明:我希望很快能在 C# 中看到这一点。我从 MS 观察到的一般策略是,它不喜欢 VB.Net 和 C# 在功能方面相差太远。如果一种语言具有另一种语言不支持的功能,它往往会成为下一个版本的语言团队的优先事项。

    【讨论】:

    • 然后想一想,我打算在我自己的博客上拉皮条(几个月前我在那儿解决了这个问题)......但是你省去了我的麻烦,而且那个条目比我自己的。感谢您的链接!
    • 您还可以查看使用反射器从 VB 生成的 IL/C# 代码,我注意到前一段时间。看看在 C# 中可以完成哪些 VB 技巧也很有趣
    【解决方案2】:

    我个人很高兴 C# 没有有这个。从逻辑上讲,方法没有状态:类型和实例有。 C# 使逻辑模型更清晰,IMO。

    【讨论】:

    • 同意用这个方法来保存状态是个坏主意。请注意,在这种情况下,目的是确保正则表达式的创建/编译只发生一次。你可以说这是一种状态,但我认为这实际上是关于性能,而不是在方法调用之间保存数据。
    • 在这种情况下,只要成为静态只读字段就可以了。它是与类型相关联的不可变状态,在类型初始化时初始化。对我来说是静态的有意义:)
    • 我认为你还没有使用闭包。它们实际上是存储在方法中的可变状态。
    • 是的,我当然使用过闭包——但我认为它们是封装“方法+环境”而不仅仅是一种方法。 (状态本身在必要时存储在单独的类中。)
    【解决方案3】:

    不幸的是,C# 中没有等价物。

    您将需要使用类级别变量。

    这是我希望 C# 拥有的少数 VB 功能之一。

    【讨论】:

      【解决方案4】:

      你必须在类级别上声明:

      private static readonly RegEx badAmpersand = new RegEx("...");
      

      【讨论】:

      • 在这种情况下应该可以工作,但从一般意义上说,它比这更复杂,因为在多线程应用程序中可能存在并发问题。 VB.Net 静态成员应该是线程安全的。
      猜你喜欢
      • 1970-01-01
      • 2021-09-10
      • 1970-01-01
      • 2015-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-14
      • 2016-12-29
      相关资源
      最近更新 更多