C# 在比较字符串时避免调用mscorlib?
有没有一种方法可以让我在不调用op_相等函数Is mscorlib的情况下比较字符串? 例如:C# 在比较字符串时避免调用mscorlib?,c#,mscorlib,C#,Mscorlib,有没有一种方法可以让我在不调用op_相等函数Is mscorlib的情况下比较字符串? 例如: string s1 = "hi"; if(s1 == "bye") { Console.Writeline("foo"); } 汇编至: IL_0003: call bool [mscorlib]System.String::op_Equality(string, string) 从GAC看mscorlib的op_相等,它调用另一个方法Equals(string,string) 代码: 它使用操作
string s1 = "hi";
if(s1 == "bye")
{
Console.Writeline("foo");
}
汇编至:
IL_0003: call bool [mscorlib]System.String::op_Equality(string, string)
从GAC看mscorlib的op_相等,它调用另一个方法Equals(string,string)
代码:
它使用操作代码bne.une.s来比较这些字符串
现在回到我的问题,我如何在不调用mscorlib函数的情况下比较两个字符串,就像方法Equals那样
现在回到我的问题,我如何在不调用mscorlib函数的情况下比较两个字符串,就像方法Equals那样
如果不从头开始编写自己的字符串比较方法,您就不能——至少不能
在某些情况下,您必须至少调用String.Equals(a,b)
(以便调用私有EqualsHelper
方法,该方法进行实际比较),该方法也在mscorlib
中定义
如果您希望避免接线员呼叫,您可以直接呼叫Equals
,不过:
string s1 = "hi";
if (string.Equals(s1, "bye"))
{
Console.WriteLine("foo");
}
这将避免调用op_Equality
,绕过它并直接调用Equals
话虽如此,实际上没有理由不首先对字符串调用
op_Equality
。这是另一种比较方法:
string s1 = "Hello";
bool same = s1.CompareTo("Hello") == 0;
bool different = s1.CompareTo("GoodBye") != 0;
Console.WriteLine(same);
Console.WriteLine(different);
在这种情况下,两者都应该向控制台报告“True”
另一种方式:
private static bool CheckEqual(string s1, string s2)
{
char[] c1 = (s1 == null) ? new char[0] : s1.ToCharArray();
char[] c2 = (s2 == null) ? new char[0] : s2.ToCharArray();
if (c1.Length != c2.Length) { return false; }
for (int i = 0; i < c1.Length; i++)
{
if (!c1[i].Equals(c2[i])) { return false; }
}
return true;
}
private static bool CheckEqual(字符串s1、字符串s2)
{
char[]c1=(s1==null)?新字符[0]:s1.tocharray();
char[]c2=(s2==null)?新字符[0]:s2.tocharray();
如果(c1.Length!=c2.Length){返回false;}
for(int i=0;i
看起来您需要一个字符串比较函数。字符串基本上是可以以类似方式索引的字符数组。下面是一个简单的字符串比较算法
public static bool Equals(string left, string right)
{
if (ReferenceEquals(left, null)) return ReferenceEquals(right, null);
if (left.Length != right.Length) return false;
for (int i = 0; i < left.Length; i++)
{
if (left[i] != right[i])
return false;
}
return true;
}
公共静态bool等于(字符串左、字符串右)
{
if(ReferenceEquals(left,null))返回ReferenceEquals(right,null);
如果(left.Length!=right.Length)返回false;
for(int i=0;i
已经向您展示了这一点,没有理由避免使用mscorlib实现,因为我的示例多次调用mscorlib。鉴于
String
类由mscorlib
提供,如果不使用mscorlib
,绝对无法比较两个字符串。即使只是使用索引器将每个字符调用到mscorlib
避免
mscorlib
的唯一方法是不使用.Net运行时,但如果要使用C#,这是相当困难的。为什么要避免mscorlib?您可以编写自己的方法,也许可以通过迭代字符来实现。但是重点是什么呢?很可能你写的任何方法都不会像内置方法那么快。内置方法使用不安全的代码来非常有效地执行相等性检查;这将避免mscorlib。但是String.Equals方法实际上如何比较这两个字符串呢?我的意思是一定有办法。@great刚刚编辑了更多细节。它使用了一个私有方法(string.EqualsHelper
),这也是在mscorlib
中定义的-因为它是私有的,你不能自己调用它。我很确定CompareTo
是由mscorlibMSDN为CompareTo
提供的关于0
:“这个实例在排序顺序中的位置与strB相同。”因此,它们肯定是相等的,但不能保证相等。老实说,我不确定实际的行为,但我建议你不要依赖任何没有明确说明的东西@Mudu plus,CompareTo
的效率可能低于Equals
。如果有不同长度的长字符串,且以相同的子字符串开头,则检查长度后Equals将立即返回false,但CompareTo必须遍历字符串,直到找到不匹配的字符。True,这并不能解决不使用mscorlib的问题,也不是比较两个字符串的最佳方法。最好的方法是尽量避免,但使用.Equals而不是==运算符,因为不管怎样,它只会落到.Equals上。@phoog-是的,我想,但是OP会问一些问题,如何避免任何与mscorlib单声道等效的程序集。这无疑是正确的。我只是想指出,有一些方法可以在不使用.NET运行时的情况下使用C。
public static bool Equals(string left, string right)
{
if (ReferenceEquals(left, null)) return ReferenceEquals(right, null);
if (left.Length != right.Length) return false;
for (int i = 0; i < left.Length; i++)
{
if (left[i] != right[i])
return false;
}
return true;
}