- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用-C#(.Net Framework 4.5,Visual Studio 2012)
我试图理解像Delegate这样的主题,目前我的观点不多,我需要澄清一下。
我在互联网上发现了许多不同的信息来描述如何使用它,但是对我来说,理解这个主题有点复杂。
据我了解,我必须做一些使用委托的事情:
创建一些实体来使用它(需要创建一些委托)
声明一个委托类型
创建一些我要委托的方法
在主类中,使用具有实体的必需方法调用委托(从第一点开始)
全部描述如下
问题-我是否正确理解所有内容,或者我错了-请澄清一下。
还有一个关于DELEGATE的问题-在控制台C#应用程序中,什么地方最好用DELEGATE放置代码,我可以在使用的命名空间的任何位置创建它,如下所示。
但是,也许不仅对控制台应用程序而且对于WinForms,WPF等都放置委托的一些建议/要求。
这个主题对我来说是新的,我花了一天的时间来理解它,但仍然对此感到困惑(或更多),最后创建这篇文章以更好地理解。认为这是非常强大的东西。
编辑
namespace SimpleCSharpApp
{
delegate void myDelagate ();
}
最佳答案
呵呵..你搞砸了。在我看到VS的屏幕快照的“ delegate”声明下带有红色下划线的屏幕截图之前,我还不太了解您要解决的问题。
首先,暂时忽略public void delegate zczcxxzc
行。这有点特别。首先,让我们看一些标准类型的委托。
最基本的两个是:System.Action
System.Func
两者都是通用的,并且第一次看它们的签名,它们似乎过于复杂。但是,它们确实非常简单。
对于初学者,让我们将其限制为裸,无参数的System.Action
。
private static void myFunction1() { Console.WriteLine("Hello!"); }
private static void myFunction2() { Console.WriteLine("Bye!"); }
private static void myFunction0() { return; }
... // in some function, i.e. Main()
Action myDelegate = null;
myDelegate = new Action( myFunction1 );
myDelegate(); // writes "Hello!"
myDelegate = new Action( myFunction2 );
myDelegate(); // writes "Bye!"
myDelegate = new Action( myFunction3 );
myDelegate(); // does "nothing"
new Action
时,都会创建一个新的委托。 “委托”只是一个对象,例如字符串“ foo”或float [] {1.2,4.5}。
new Action(...)
。就像创建任何对象一样-新+类型名+构造参数。另一个代表“委托”只是一个对象。
new Action( myFunction1() )
。我不想调用该方法并获取其结果并将该结果提供给Action的构造函数。我写了
new Action( myFunction1 )
。我把函数本身交给了构造函数。
static
处编写
myFunction
。这些可以称为无对象/无目标。您只需要他们的名字,就可以从任何地方打电话给他们。要调用它们,一个简单的哑指针就足够了。
class GuineaPig
{
public static void Squeak() { Console.WriteLine("Ieek!"); }
public void Well() { Console.WriteLine("actually"); }
public void IDontKnow() { Console.WriteLine("what they do"); }
}
GuineaPig.Squeak(); // says 'ieek'
Action myDelegate = null;
myDelegate = new Action( GuineaPig.Squeak );
myDelegate(); // writes "ieek"
// GuineaPig.Well(); // cannot do!
// myDelegate = new Action( GuineaPig.Well ); // cannot do!
GuineaPig.Well
-很明显。它不是静态的,需要针对对象而不是类进行调用。由于同样的原因,无法创建委托。让我们修复一下:
class GuineaPig
{
public void Well() { Console.WriteLine("actually"); }
public void IDontKnow() { Console.WriteLine("what they do"); }
}
GuineaPig myPiggie = new GuineaPig();
myPiggie.Well(); // ok! writes "actually"
Action myDelegate = null;
myDelegate = new Action( myPiggie.Well ); // ok!
myDelegate(); // ok! writes "actually".
class GuineaPig
{
public string Name;
public void Well() { Console.WriteLine("I'm " + Name); }
}
GuineaPig myPiggie1 = new GuineaPig { Name = "Bubba" };
GuineaPig myPiggie2 = new GuineaPig { Name = "Lassie" };
Action myDelegate = null;
myDelegate = new Action( myPiggie1.Well );
myDelegate(); // -> Bubba
myDelegate = new Action( myPiggie2.Well );
myDelegate(); // -> Lassie
myPiggie1 = myPiggie2 = null;
myDelegate(); // -> Lassie
Action<string, int>
),可以返回值(
Func<int>
)或两者都返回(
Func<string,int>
)。然而,经常用
Func<int,float,string,int,int,bool,decimal>
来表达是有点……晦涩的。
Func<int,int,int,bool,bool,Zonk,string>
的类型,而是“ MyStudentFilteringDelegate”。
&
(地址),也无法重载operator()。这导致您无法编写自己的类似于委托的类。
class MyStudentFilteringDelegate
{
public object Target;
public somethingstrange* MethodPointer;
// other code
}
MyDelegate dd = new MyDelegate ( ... );
dd(); // is just impossible!!!
public void delegate xxx
下的红色下划线。
public bool delegate MyStudentFilteringDelegate( Student stud );
Func<Student,bool>
完全相同,带有自定义名称。 *)
public class MyStudentFilteringDelegate : some_framework_Delegate_class
{
// object Target {get;} - inherited from base class
// MethodInfo Method {get;} - inherited from base class, too
}
var dd = new MyStudentFilteringDelegate ( ... ); // like normal class!
dd(); // ok!;
public bool delegate MyStudentFilteringDelegate( Student stud );
MyStudentFilteringDelegate
是一个类,就像Action或Func或String或WebClient一样。
delegate
关键字只是一个标记,编译器可以知道该标记应对该行应用哪种转换以生成适当的“委托类型”(类)。
public void delegate XYZ(...)
。就像您可以在任何地方放置类声明一样。
public class Xc {}
public void delegate Xd();
namespace WTF {
public class Xc {}
public void delegate Xd();
class Whatever {
public class Xc {}
public void delegate Xd();
}
}
::global.Xc
和
::global.Xd
,第二对命名为
WTF.Xc
和
WTF.Xd
,最后一对命名为
WTF.Whatever.Xc
和
WTF.Whatever.Xd
。就像正常情况一样。
MyApp.Text.Parsing
中,则与该文本处理相关的所有委托类型也应位于该命名空间中。但是,即使如此,这纯粹是装饰性和组织性的。将它们放置/定义在您认为合适的任何范围内。
delegate
关键字和编译器技巧比Action和Func类更早。在.Net 2.0中,Action / Func不存在。创建/使用委托的唯一方法是定义自己的新委托类型(或在系统名称空间的深处查找/猜测一些合适的委托类型)。请记住,每个新的委托类型都是一个新的类。不能转换为任何其他类,甚至外观也不相似。它是如此令人厌烦且难以维护,以至于在.Net 3.5中,他们最终在框架中包括了“通用通用委托类型”。从那时起,Action / Func越来越多地被使用,因为即使它们更难阅读,它们仍然是通用的。可以“随处”传递
System.Func<Student,bool>
,您不会遇到另一个问题:“ bool委托StudentFilter()
from one library does not match
bool委托StudentSelector()`”的问题。
关于c# - 如何以正确的方式使用委托(delegate)/了解委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19963454/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!