Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.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# Linq Lambda表达式==与等于运算符_C#_.net_Lambda - Fatal编程技术网

C# Linq Lambda表达式==与等于运算符

C# Linq Lambda表达式==与等于运算符,c#,.net,lambda,C#,.net,Lambda,这些语句产生相同的结果吗 我知道Equals比较存储在引用中的值,而“==”比较两个引用是否指向同一个对象 不,这只是引用类型的默认=运算符的行为。当=的两侧都有编译时类型string时,将使用string类中声明的bool运算符==(string,string)重载,当调用的目标不为null时,将得到与Equals相同的结果 这种行为在正则代码中与在lambda表达式中完全相同。使用lambda表达式编写的代码的行为方式应与不使用lambda表达式编写的代码完全相同。。。虽然如果lambda表

这些语句产生相同的结果吗

我知道Equals比较存储在引用中的值,而“==”比较两个引用是否指向同一个对象

不,这只是引用类型的默认
=
运算符的行为。当
=
的两侧都有编译时类型
string
时,将使用
string
类中声明的
bool运算符==(string,string)
重载,当调用的目标不为null时,将得到与
Equals
相同的结果

这种行为在正则代码中与在lambda表达式中完全相同。使用lambda表达式编写的代码的行为方式应与不使用lambda表达式编写的代码完全相同。。。虽然如果lambda表达式被转换为表达式树,编译器只将代码作为数据发出,因此使用表达式树的任何人都可以使用它来做正确的事情

是的,代码应该工作得非常好-使用
Equals
和使用
=
之间的唯一区别是,如果列表包含任何
null
元素,
x.Equals(…)
调用将抛出
NullReferenceException
。就我个人而言,为了简单起见,我通常将字符串与
=
进行比较

但即使在lambda表达式中也是一样的吗

var list = new List<string>();
var word = "some word";
list.Add("some word");
list.Add("some sentence");
list.Add(word);
有一个简单的方法来回答这个问题:测试它

list.RemoveAll(x => x.Equals("some word"));
list.RemoveAll(x => x == "some word");

因此,答案是否定的。即使在lambda表达式中,
=
运算符和
Equals
方法调用之间的差异也会保持不变。如果你想一想:为什么不应该是这样?lambda表达式假设它们在这里做同样的事情,并将其简化为一种或另一种类型,这是没有意义的。毕竟,.

LINQ不会改变
=
操作符或
Equals
方法的工作方式。而且,
=
在C#中不一定像在Java中那样“比较引用”——它是任何创建的合理操作符重载。一个很容易产生影响的差异是
null。等于(x)
将引发异常,而
null==x
不会。”“==”比较引用本身”-这取决于
x
的类型。如果
x
是一个字符串,它将调用
string
中的
=
操作符,该操作符执行值比较。如果
x
的类型是object(即编译时类型),则它将执行引用比较。请提供一个示例,以便我们能够实际解释
=
的含义。理想情况下,也告诉我们问题的动机。。。基本上,lambda表达式中的代码的行为与普通代码一样,假定它被转换为委托。(如果它被转换为表达式树,那么它的含义应该是相同的,但是任何使用该树的东西都可以对其进行不同的解释。)
.Equals
不会“比较存储在引用中的值”,它会做
T.Equals(T)
的程序员决定它应该做的任何事情,在字符串的上下文中,它进行字符串值比较,而不是引用比较,虽然两个相等的引用当然也意味着相等的值,但即使使用不同的引用,但值相同,
。字符串上的Equals
将返回
true
@Lasse V.Karlsen是的,我同意这一点。我只想知道字符串对象的情况。如果程序是用c#编写的,我同意你的回答。但是在Java中没有运算符重载,在这种情况下它会如何运行?@Prabu:那么它将遵守Java的规则。问一个关于一种特定语言的问题,然后假设结果适用于其他所有语言是没有意义的。
void Main()
{
    WhatIsThis<string>(x => x.Equals("foo"));
    Console.WriteLine();
    WhatIsThis<string>(x => x == "foo");
}

void WhatIsThis<T>(Expression<Func<T, bool>> expr)
{
    Console.WriteLine(expr.Body.NodeType);
    if (expr.Body is MethodCallExpression)
    {
        var ce = expr.Body as MethodCallExpression;
        Console.WriteLine(ce.Method.Name);
        Console.WriteLine(ce.Object.ToString());
        Console.WriteLine(string.Join(", ", ce.Arguments.Select(x => x.ToString())));
    }
    else if (expr.Body is BinaryExpression)
    {
        var be = expr.Body as BinaryExpression;
        Console.WriteLine(be.Method.ToString());
        Console.WriteLine(be.Left.ToString());
        Console.WriteLine(be.Right.ToString());
    }
}
Call
Equals
x
"foo"

Equal
Boolean op_Equality(System.String, System.String)
x
"foo"