Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重置变量的好方法_C# - Fatal编程技术网

C# 重置变量的好方法

C# 重置变量的好方法,c#,C#,我发现自己一直在这样做,对于大型的预先存在的对象,我们希望稍微修改以传递给另一个调用,但不希望复制,但不希望调用方看到更改: ResultType f(T x, TLarge config) { var oldVal = config.blah; // 1st line of boilerplate config.blah = "New Value"; // 2nd line of boilerplate try { return g(config);

我发现自己一直在这样做,对于大型的预先存在的对象,我们希望稍微修改以传递给另一个调用,但不希望复制,但不希望调用方看到更改:

ResultType f(T x, TLarge config) {
    var oldVal = config.blah; // 1st line of boilerplate
    config.blah = "New Value"; // 2nd line of boilerplate
    try {
        return g(config);
    }
    finally
    {
        config.blah = oldVal; // 3rd line of boilerplate
    }
}
这会变得有点混乱,尤其是当有多个变量需要更改时

有没有一个很好的方法可以把它总结成一个模式?我尝试使用
使用
并将引用作为成员粘贴到IDisposable结构上,然后在关闭时重置,但这不起作用,因为引用不能成为成员


我临时修改的很多类型都是字符串和整数,因此这需要与值类型一起使用。

另外,您的最后一句话似乎表示您认为字符串是一种值类型,而不是,它是一种引用类型。还需要澄清的是,您实际上并没有修改字符串或int-您正在修改一个包含字符串或int作为属性或字段的对象。虽然您可以编写一个方法在某种程度上处理此问题,但您需要传入旧值、新值、重设值的委托,还有一个要在try块中执行的委托-此时代码看起来比简单的try/finally块复杂得多。只是开玩笑而已。很确定,通过反射,你可以做这样的事情
tempChange(配置,“blah”,newValue,{code})
。甚至可以对多个字段进行一些修改。在此上下文中,
ResultType
fixed/始终相同吗?或者它也可能因上下文而异?您是否考虑过克隆,以避免需要还原步骤?另一方面,您的最后一句话似乎意味着您认为字符串是一种值类型-它不是,它是一种引用类型。还需要澄清的是,您实际上并没有修改字符串或int-您正在修改一个包含字符串或int作为属性或字段的对象。虽然您可以编写一个方法在某种程度上处理此问题,但您需要传入旧值、新值、重设值的委托,还有一个要在try块中执行的委托-此时代码看起来比简单的try/finally块复杂得多。只是开玩笑而已。很确定,通过反射,你可以做这样的事情
tempChange(配置,“blah”,newValue,{code})
。甚至可以对多个字段进行一些修改。在此上下文中,
ResultType
fixed/始终相同吗?或者它也会因上下文而异?您是否考虑过克隆,以避免需要还原步骤?