代码之家  ›  专栏  ›  技术社区  ›  Joel Coehoorn

带有静态数据的函数

  •  6
  • Joel Coehoorn  · 技术社区  · 16 年前

    在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来做这个?我找不到它的等价物。

    4 回复  |  直到 16 年前
        1
  •  13
  •   Joel Coehoorn    16 年前

    哈!在发布问题时,我找到了答案!与其在谷歌上搜索c,我本应该一直在寻找有关vb.net如何实现它的详细信息,并且键入问题使我明白了这一点。在应用了这一见解之后,我发现:
    http://weblogs.asp.net/psteele/articles/7717.aspx

    这篇文章解释了clr并不真正支持它,而vb编译器在该方法的类中创建了一个静态(共享)变量“under the hood”。为了在C中做同样的事情,我必须自己创建变量。

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

    附带说明:我希望很快能在C中看到这个。我从MS中观察到的一般策略是,它不喜欢vb.net和c在特性方面过于分散。如果一种语言有另一种语言不支持的特性,那么它将成为下一个版本的语言团队的优先事项。

        2
  •  6
  •   Jon Skeet    16 年前

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

        3
  •  4
  •   Max Schmeling    16 年前

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

    您需要使用一个类级变量。

    这是我希望C拥有的为数不多的东西之一。

        4
  •  1
  •   Rinat Abdullin    16 年前

    您必须在类级别上声明:

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