好的,我知道这个问题很简单,我承认我对C#也很陌生。但标题并没有描述这里的整个情况所以请听我说。
我需要更改后面的C#代码中创建的URL字符串,从字符串末尾删除子字符串“.aspx”。所以基本上我知道我的URL,进入这个类,将类似“Blah.aspx”,我想摆脱该字符串的“.aspx”部分。我认为通过查找子字符串很容易做到,并且如果它存在则将其删除(或者某些类似的策略,如果某人有一个优雅的解决方案,如果他们之前认为已经完成它将会很感激)。这是问题所在:
“因为字符串是不可变的,所以在创建字符串对象后,不可能(不使用不安全的代码)修改字符串对象的值。”这是来自MSDN官方网站。所以我现在想知道,如果字符串真的是不可变的,那么我就不能(不应该)在字符串制作后改变字符串。那么我怎样才能确保我计划做的事情是安全的?
答案 0 :(得分:6)
您不更改字符串,更改变量。而不是引用诸如"foo.aspx"
之类的字符串的变量,将其改为指向具有值"foo"
的新字符串。
作为类比,在第二个中添加一个不会更改第二个。两个仍然是一样的,你已经改变了一个变量,从引用一个数字来引用另一个。
至于您的具体情况,EndsWith
和Remove
足够简单:
if (url.EndsWith(".aspx"))
url = url.Remove(url.Length - ".aspx".Length);
请注意,Remove
正在使用一个字符串,一个整数,为我们提供一个全新的字符串,我们需要将其分配回变量。它不会改变字符串本身。
另请注意,您可以使用URI类来解析URL,并且它将能够处理可能出现的所有复杂情况,包括哈希,查询参数等。您应该使用用于解析您感兴趣的URL的各个方面。
答案 1 :(得分:5)
字符串不变性对于正常使用来说不是问题 - 它只是意味着像“替换”这样的成员函数,而不是修改现有的字符串对象,返回一个新的。实际上,通常只是意味着您必须记住将更改复制回原始文件,例如:
string x = "Blah.aspx";
x.Replace(".aspx", ""); // still "Blah.aspx"
x = x.Replace(".aspx", ""); // now "Blah"
字符串的奇怪之处在于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"
答案 2 :(得分:2)
正如你所说,C#中的String
是不可变的。这意味着这将在内存中创建多个String
对象:
String s = "String of numbers 0";
s += "1";
s += "2";
因此,虽然变量s
将返回值String of numbers 012
,但在内部它需要在内存中创建三个字符串才能完成。
在您的特定情况下,解决方案非常简单:
String myPath = "C:\\folder1\\folder2\\myFile.aspx";
myPath = Path.Combine(Path.GetDirectoryName(myPath), Path.GetFileNameWithoutExtension(myPath));
同样,这看起来好像myPath
已经改变了,但实际上并没有改变。发生了内部复制和分配,您可以继续使用相同的变量。
此外,如果您必须保留原始变量,则只需创建一个新变量:
String myPath = "C:\\folder1\\folder2\\myFile.aspx";
String thePath = Path.Combine(Path.GetDirectoryName(myPath), Path.GetFileNameWithoutExtension(myPath));
无论哪种方式,您最终都会得到一个可以使用的变量。
请注意,Path
方法的使用可确保您获得正确的路径操作,而不是可能产生意外副作用的盲目String
替换。
答案 3 :(得分:1)
String.Replace()
不会修改字符串。它将创建一个新的。所以下面的代码:
String myUrl = @"http://mypath.aspx";
String withoutExtension = myUrl.Replace(".aspx", "");
将创建一个全新的字符串,该字符串将分配给withoutExtension。