Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.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# 在不传递参数的情况下调用的方法_C# - Fatal编程技术网

C# 在不传递参数的情况下调用的方法

C# 在不传递参数的情况下调用的方法,c#,C#,我是C#的初学者。我在我的项目中遇到了下面的代码片段。我不明白如何在不传递任何参数的情况下调用ViewHelper.IsInView。谁能给我解释一下吗。提前谢谢 public static class ViewHelper { public static bool IsInView(IFrameworkElement element) { ---------- } } var Result = Views.Any(ViewHelper.IsInView); Any方法接受形

我是C#的初学者。我在我的项目中遇到了下面的代码片段。我不明白如何在不传递任何参数的情况下调用
ViewHelper.IsInView
。谁能给我解释一下吗。提前谢谢

public static class ViewHelper
{
  public static bool IsInView(IFrameworkElement element)
  {
  ----------
  }
}

var Result = Views.Any(ViewHelper.IsInView);

Any
方法接受形式为
Func
的委托(指向函数的指针)。这意味着它需要一个方法来接受集合类型的元素(我猜在您的例子中是
IFrameworkElement
),并返回一个
bool
——这正是
IsInView
方法的签名


然后,
Any
方法对
Views
集合中的元素执行此委托,直到遇到返回
true
的委托为止

在C#中,存在从“方法组”到委托类型的隐式转换。基本上,当你写作的时候

Views.Any(ViewHelper.IsInView)
它转化为

Views.Any(new Func<IFrameworkElement, bool>(ViewHelper.IsInView))
Views.Any(新函数(ViewHelper.IsInView))
传递给的是委托,此时不调用该方法。如果存在任何视图,则
any
将使用一个或多个视图作为参数调用该委托

传递给
Any
的委托是通过隐式方法组转换创建的

视图。任何
都需要类型为
Func
的委托,这意味着它接受类型为
iframewelement
的单个参数并返回
bool
。您可以从方法中创建这样的委托,因为签名是兼容的。这是您明确执行此操作的方式:

Func谓词=
新函数(ViewHelper.IsInView);
但是,在C#2.0中,这种转换可以隐式完成,这意味着此代码完全相同:

Func<IFrameworkElement, bool> predicate = ViewHelper.IsInView;
Func谓词=ViewHelper.IsInView;

在ViewHelper中是否有其他IsInView重载?否,IsInView没有任何重载。它正在使用当前视图(包含左视图、顶视图、宽度、高度)并传递元素(也包含左视图、顶视图、宽度、高度)。框架能够通过名称获取属性值。
Func<IFrameworkElement, bool> predicate = ViewHelper.IsInView;