C#,你如何使一个对象重新初始化?

时间:2009-01-23 00:13:14

标签: c# regex object

好的,在Perl中,导致对象重新初始化很容易,因为它由可指定的引用或指针表示。但是,C#似乎不喜欢这样。

我想创建一个System.Text.RegularExpressions.Regex的子类,其模式可以在不使用新对象的情况下进行更改,并为每个对象消耗内存。 (私有初始化引用不会让我再次运行它所以我尝试重新创建对象引用)。

这是否可以在不创建父对象周围的完整包装的情况下重新实现每个方法以指向为每个新用户重新初始化的私有正则表达式对象?还有更好的方法吗?

public class m_Regex : System.Text.RegularExpressions.Regex{

    public m_Regex(string pattern): base (pattern){

    }

    public void Pattern(string pattern){
        this = new m_Regex(pattern);
    }   
}

6 个答案:

答案 0 :(得分:2)

我不确定你要解决的问题究竟是什么。如果您担心正在使用的内存量,可能是由于快速创建/删除Regex对象,那么您可以让您的包装器实现IDisposable并将它们包装在using块中,以便更多地释放资源迅速。如果正则表达式对象的数量相当小,那么我不确定我是否会过分担心它。一旦对象超出范围,就可以进行垃圾回收。如果修复了Regex对象,您可能还想考虑在“正则表达式工厂”中创建静态实例,并且可以反复使用它们。

答案 1 :(得分:2)

System.Text.RegularExpressions.Regex类以这种方式运行的原因是因为它是不可变的。因此,一旦创建了Regex对象,就无法更改模式。简而言之,没有办法做你想做的事情,即用新模式重新初始化现有对象。如果要根据定义更改模式,则必须创建新的Regex对象。

答案 2 :(得分:1)

//First use
myregex = new RegEx("^Pattern$");    
// later on in the code, i need to change pattern
// this call is different to the first, and i can't tell why..
myregex = myregex.Pattern("^NewPattern$");

如果我要查看使用此模式的代码,我会立即跳转到.Pattern的实现,以了解为什么myregex的“下一次”使用与第一次使用不同。我的期望是新正则表达式的构造受到当前正则表达式实例的状态的影响(我一直在尝试并且未能如何影响它)。

.Pattern有一种工厂方法的感觉,但它本身就是一个实例,我觉得这很混乱,并且似乎没有为直接使用RegEx构造函数添加任何值。

关于GC问题,GC可以通过调用GC.Collect()来强制运行,但是它要求集合是一个特例,不应该作为规则调用。

答案 3 :(得分:0)

C#不支持这样的语法。实际上,如果您尝试编译代码,您将收到一个编译错误,指出:“这是一个只读属性”。不幸的是,今天没有运气。 :)

另一种方法是不要将你的类建立在Regex上,而是使用包装类。例如。

public class Wrapper
{
 private Regex _regex;
 public Wrapper(string pattern)
 {
  _regex = new Regex(pattern);
 }
}

答案 4 :(得分:0)

我想知道是否有一个好的外部正则表达式“竞争对手”可以用于内置的.NET。

可能= http://www.codeguru.com/Cpp/Cpp/string/regex/article.php/c2779/

答案 5 :(得分:0)

经过一番讨论之后,我发现这可以实现我想要的一些(次要的)语义差异

`public class m_Regex:System.Text.RegularExpressions.Regex {

    public m_Regex(string pattern): base (pattern){

    }

    public m_Regex Pattern(string pattern){

        return new m_Regex(pattern);
    }


}`

所以现在我可以使用pattern来重新定义当前正则表达式,方法是为保持变量赋予一个新的对象引用,而不是替换实例本身。所以现在(大概)以前的正则表达式参考标记为GC,因为没有人再使用它,更可口和自我记录

myregex = myregex.Pattern(“^ NewPattern $”);可以用来给出模式改变正则表达式的功能错觉,虽然我认为我仍然希望能够简单地调用该成员并使其完全在幕后发生。

我是对的吗? GC会在这种模式下拾取所有使用过的正则表达式吗?即使在当前实例化范围内,它是否会这样做? GC什么时候发生?