Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.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#_Mspec - Fatal编程技术网

C# “是什么引起和区别了?”;它是&引用;因为";及;设立;

C# “是什么引起和区别了?”;它是&引用;因为";及;设立;,c#,mspec,C#,Mspec,我最近开始使用MSpec,将类分为,建立,因为和,它 虽然我知道如何使用它们,但我不确定是什么让它们起作用 我知道他们是代表 Because of = () => { }; 但在了解如何定义代理时: public delegate void Print(int value); 它看起来像是build,,因为和It被定义为不返回任何内容(void)且不接受任何参数的委托 这是有道理的,但是如何建立,,因为和,是相互区别的。也就是说,停止使用It而不是建立的内容仍能正常工作。他们中的一个

我最近开始使用MSpec,将类分为,
建立
因为
和,

虽然我知道如何使用它们,但我不确定是什么让它们起作用

我知道他们是代表

Because of = () =>
{

};
但在了解如何定义代理时:

public delegate void Print(int value);
它看起来像是
build
,因为
It
被定义为不返回任何内容(
void
)且不接受任何参数的委托

这是有道理的,但是
如何建立
,因为
和,
是相互区别的。也就是说,停止使用
It
而不是
建立
的内容仍能正常工作。他们中的一个怎么知道如何使用另一个?i、 e.
它使用
建立

而且他们只是被安排在课堂上。是什么激发了他们

public class foobar: setup
{
    private static int engineId;

    Because of = () =>
    {

    };

    It should = () =>
    {

    };
}
请参见上文,将委托初始化为这些函数。但我不知道他们是怎么被叫的,为什么这不好:

public class foobar: setup
{
    private static int engineId;

    It of = () =>
    {

    };

    It should = () =>
    {

    };
}
谁能帮我澄清一下吗?

是的,他们是代表:

它们都是无参数的void委托,它们在框架中的使用方式上彼此不同。例如,接受
It
的方法不会接受
建立
,因此表明了该方法的意图。不同的代理实际上是不同的类型,即使它们具有相同的签名。(您可以创建一个委托来包装具有兼容签名的不同委托类型的实例,但这种情况相对较少。)


我并不是说我特别喜欢框架或所选的名称,但是如果让不同的代理恰好具有相同的签名,那么对于这些代理来说,表达不同的预期含义是非常有意义的。

这些代理具有不同的类型,尽管它们都具有相同的签名。所以它们是根据它们的类型来区分的。例如,假设您有来自示例用法的此类:

[Subject("Authentication")]
public class When_authenticating_a_user
{
    Establish context = () =>
    {
        Subject = new SecurityService();
    };

    Cleanup after = () =>
    {
        Subject.Dispose();
    };

    static SecurityService Subject;
}
现在你想模拟运行那个测试。使用反射首先获取所有字段,因为
context
after
都是字段:

var fields = typeof(When_authenticating_a_user).GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
现在你有一堆字段,但哪个是哪个?您可以根据字段类型来区分它们。一种类型为
建立
,另一种类型为
清除
(两者都是具有相同签名的代理类型):

然后创建一个实例,并根据某些逻辑执行它们:

var instance = Activator.CreateInstance(typeof(When_authenticating_a_user));
// get method
var establishMethod = (Establish)establish.GetValue(instance);
// execute
establishMethod();

你看过定义了吗?什么,特别是那些定义你不清楚吗?哦,是的,对不起,他们是代表。但这仍然留下了一个问题,即它们如何区分和相互使用。我会更新我的问题。
var instance = Activator.CreateInstance(typeof(When_authenticating_a_user));
// get method
var establishMethod = (Establish)establish.GetValue(instance);
// execute
establishMethod();