我已经阅读过关于Func<>
的信息,它说它是一个代理人,您可以像使用它一样使用它:
Func<class,bool>
意味着你发送一个类或任何东西并得到一个bool结果,这就是我得到的! 但以下是什么意思?
Func<Class, bool> predicate
我不知道,你能告诉我吗?
答案 0 :(得分:5)
前者不会编译,因为class
是注册关键字,只能使用for class definitions。
后者是Func<T, TResult>
,它是一个采用类型T
的参数并返回类型为TResult
的对象的函数。因此,在您的情况下,该函数采用Class
类型的对象并返回bool
。
Class
的命名很不幸,但实际上允许将该标识符用于某种类型。以下是一个示例,它采用Class
类型的对象,然后检查它的属性,返回true
或false
,具体取决于比较的成功。
Func<Class,bool> predicate = obj => obj.Prop == "Foo";
var x = new Class();
x.Prop = "Foo";
Console.WriteLine(predicate(x)); // true
// with the following class definition
public class Class
{
public string Prop { get; set; }
}
Func<>
对象是 callable ,就像方法一样,所以我们可以使用括号来调用它并在这里传递对象。这相当于这样的方法:
public bool predicate(Class obj)
{
return obj.Prop == "Foo";
}
但使用Func<>
的常用方法是使用lambda expressions能够快速内联创建函数。这在LINQ中非常常用,你在{{3}}中使用lambda表达式,并且一直使用Func<>
个对象:
var filtered = listOfOjects.Where(obj => obj.Prop == "Foo").ToList();
// ^^^^^^^^^^^^^^^^^^^^^^^^
// this is the predicate function from above
// so you could also pass the predicate Func from above:
var filtered = listOfObjects.Where(predicate).ToList()
答案 1 :(得分:1)
这就是你如何实例化Func
。与字符串比较:
string str;
如果要同时实例化并分配它,可以执行以下操作:
Func<string, bool> isLongerThanThree = input => input.Length > 3;
isLongerThanThree("string"); // Returns "true"
答案 2 :(得分:1)
Func<MyClass,bool>
是委托类型
在Func<MyClass, bool> predicate
中,谓词是委托变量。
您通常会看到类似
的内容Func<MyClass, bool> predicate = c => c.IsValid;
...
if (predicate(myClass1)) DoSomething();
答案 3 :(得分:1)
您指的是predicate
这个词吗?
这只是参数的名称。请注意相似之处:
MyMethod(int myAge)
MyMethod(List<bool> myBooleans)
MyMethod(Func<Class,bool> myPredicate)
还要注意以下几点之间的相似之处:
int myAge = 30;
myAge
是int
类型的变量,其值为30
。
Func<Class,bool> myPredicate = (x => x.IsAlive);
myPredicate
是Func<Class,bool>
类型的变量,其值为(x => x.IsAlive)
。
答案 4 :(得分:1)
Func<>
是一个委托,表示返回结果的方法。 C#提供最多15个输入参数的签名,这应足以代表您将需要的所有可能方法:)
想象有15个输入参数的方法几乎不是事件。在Func<>
旁边还有一些特殊版本的委托,例如Predicate<T>
,Func<in T, bool TResult>
或Action<>
代表没有返回值的函数,返回值为{{ 1}}。
Delegates(C# Programming Guide)
您可以将匹配签名的任何方法,静态或实例甚至匿名分配给void
。例如:
Func<>
Func<MyClass, bool> predicate = (myClass) => {return true;} //anonymoys method