具有静态数据的C#函数
时间:2020-03-06 14:58:31 来源:igfitidea点击:
在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#中做到这一点?我找不到它的等效项。
解决方案
不幸的是,没有类似的东西。
我们将需要使用类级别的变量。
这是VB希望乍得拥有的少数东西之一。
哈!在发布问题时,我找到了答案!与其搜寻Google CI,不如一直在寻找VB.Net如何实现它的细节,然后输入问题对我来说很明显。应用这些见解后,我发现了这一点:
http://weblogs.asp.net/psteele/articles/7717.aspx
该文章解释说,CLR并不真正支持它,并且VB编译器在方法的类中"在幕后"创建了一个静态(共享)变量。要在C#中执行相同的操作,我必须自己创建变量。
不仅如此,它还使用Monitor
类来确保静态成员也是线程安全的。好的。
附带说明:我希望很快能在Csometime中看到这一点。我从MS观察到的一般策略是,它不喜欢VB.Net和Cto在功能方面相距太远。如果一种语言具有另一种语言不支持的功能,则该语言倾向于成为下一版本语言团队的优先事项。
我个人很高兴C没有这个。从逻辑上讲,方法没有状态:类型和实例有状态。 C使该逻辑模型更加清晰,IMO。
我们必须在类级别上声明:
private static readonly RegEx badAmpersand = new RegEx("...");