C#在创建字符串后更改字符串

DNA*_*ant 4 c# immutability

好吧,我知道这个问题非常简单,我承认我对C#也很陌生.但标题并没有描述这里的整个情况所以请听我说.

我需要更改后面的C#代码中创建的URL字符串,从字符串末尾删除子字符串".aspx".所以基本上我知道我的URL,进入这个类,将类似"Blah.aspx",我想摆脱该字符串的".aspx"部分.我认为通过查找子字符串很容易做到,并且如果它存在则将其删除(或者某些类似的策略,如果某人有一个优雅的解决方案,如果他们之前认为已经完成它将会很感激).这是问题所在:

"因为字符串是不可变的,所以在创建字符串对象后,不可能(不使用不安全的代码)修改字符串对象的值." 这是来自MSDN官方网站.所以我现在想知道,如果字符串是真正不可变的,那么我就不能(不应该)在字符串制作后改变字符串.那么我怎样才能确保我计划做的事情是安全的?

Ser*_*rvy 6

您不更改字符串,更改变量.而不是引用字符串的变量,将其"foo.aspx"更改为指向具有该值的新字符串"foo".

作为类比,在第二个中添加一个不会改变第二个.两个仍然是一样的,你已经改变了一个变量,从引用一个数字引用另一个.

至于你的具体情况,EndsWithRemove让它变得容易:

if (url.EndsWith(".aspx"))
    url = url.Remove(url.Length - ".aspx".Length);
Run Code Online (Sandbox Code Playgroud)

注意这里Remove是一个字符串,一个整数,并给我们一个全新的字符串,我们需要将其分配回我们的变量.它不会改变字符串本身.

另请注意,您可以使用URI类来解析URL,它将能够处理可能出现的所有复杂情况,包括哈希,查询参数等.您应该使用它来解析方面的问题.您感兴趣的网址.


McG*_*gle 5

字符串不变性对于正常使用来说不是问题 - 它只是意味着像"替换"这样的成员函数,而不是修改现有的字符串对象,返回一个新的.实际上,通常只是意味着您必须记住将更改复制回原始文件,例如:

string x = "Blah.aspx";
x.Replace(".aspx", "");       // still "Blah.aspx"
x = x.Replace(".aspx", "");   // now "Blah"
Run Code Online (Sandbox Code Playgroud)

字符串的奇怪之处在于System.String继承的事实System.Object,但由于其不变性,其行为类似于值类型而不是对象.例如,如果将字符串传递给函数,则无法修改它,除非您通过引用传递它:

void Test(string y)
{
    y = "bar";
}
void Test(ref string z)
{
    z = "baz";
}
string x = "foo";
Test(x);                 // x is still "foo"
Test(ref x);             // x is now "baz"
Run Code Online (Sandbox Code Playgroud)