为什么无法更新扩展方法中字符串的值?



我正在尝试创建一个扩展方法来简化我使用很多的一小段代码:

var test = "this is a test.";
var substring = test.Substring(0, 4);
test = test.Remove(0, 4).Trim();
在运行上述代码片段并将testsubstring的结果值打印到控制台窗口后,您将看到:
this
is a test.

我想用一个扩展方法来简化它,这将是Substring的有效过载:

public static string Substring(this string input, int startingIndex, int length, bool removeFromInput = false) {
var substring = input.Substring(startingIndex, length);
if (removeFromInput)
input = input.Remove(startingIndex, length);
return substring;
}

这将允许我的代码简化为:

var test = "this is a test.";
var firstWord = test.Substring(0, 4, removeFromInput: true).Trim();
var secondWord = test.Substring(0, 2, removeFromInput: true).Trim();
var thirdWord = test.Substring(0, 1, removeFromInput: true).Trim();
var lastWord = test.Substring(0, 4, removeFromInput: true).Trim();

让我们不要太迂腐,关注我可以在这里根据空白分割的事实;这不是一个普遍的例子,而且通常情况下它不是关注单词,而是关注特定的子字符串。

在网上看了一会儿之后,我理解为什么这对值类型不适用(这里有一篇关于这一点的文章),但是string是一种引用类型,尽管在许多情况下它被视为值类型(这里是关于该主题的文章)。这又是一个那样的案子吗?如果是,为什么?


为什么我不能在扩展方法中更新字符串的值?

我不是在寻找替代品,我试图理解为什么这不起作用,因为string是一个引用类型。我的替代实现是test.Substring(0, 4, removeFrom: ref test),我认为它仍然读起来很好。

这里的问题是,虽然string是引用类型,但当您向方法传递参数时,该引用被复制。这样就创建了一个指向内存中相同对象的新变量。当你让这个变量指向一个新对象时,它不会影响原来的对象。

下面是一个例子来说明我的意思:

var foo = "foo";
var bar = foo;
bar = "bar";

创建一个字符串,并将其引用存储在foo变量中。然后我们创建一个bar变量,并在其中存储foo的引用。这是引用的副本,现在两个变量都指向同一个对象。

当我们创建一个新的字符串并将其赋值给bar时,它不影响foo。现在bar只是保存了对另一个对象的引用。

有一种方法可以使原始参数被修改而引用不被复制,这可以通过使用ref参数来实现。但据我所知,ref修饰符不支持扩展方法的第一个参数。

相关内容

  • 没有找到相关文章

最新更新