我是嘲笑的新手,所以我可能在这里完全错了,但我相信大多数模拟框架都依赖于接口.不幸的是,我们的大部分代码都没有使用接口.前几天我在Java中看到了一个Mocking框架,它重现了类\ object的字节代码,而不是调用它的内部方法,但你仍然可以测试它是否正在调用这些方法.
我的问题是:.Net有没有可以做类似事情的模拟框架?我正在寻找一些免费的东西,我不想要一些需要虚拟或抽象方法的东西.
为什么在C#中示例一个有效的,可编译的并且只是包装而示例B将无法编译?
一个
int val = 0;
val = val + Int32.MaxValue +2;
Run Code Online (Sandbox Code Playgroud)
要么
int val = Int32.MaxValue;
val++;
Run Code Online (Sandbox Code Playgroud)
乙
int val = 0;
val = 2147483647 + 1;
Run Code Online (Sandbox Code Playgroud)
要么
int val = 0;
int val = Int32.MaxValue + 1;
Run Code Online (Sandbox Code Playgroud)
默认情况下,我知道默认情况下不会检查算术异常,除非您使用配置中的checked方法,块或属性明确地这样做.我的问题更多地涉及编译器然后如何发生算术异常.
正如你们中的一些人可能会注意到这个问题是来自Project Euler的问题16.我已经使用C#4.0的新"bigInt"功能解决了这个问题,这个功能非常简单,但也没有真正学到我应该学到的东西.我假设因为它是2 ^ 1000会有某种位移解决方案,但我无法弄清楚它究竟是如何工作的.
有没有人知道如何在不使用bigint的情况下计算2 ^ 1000?
public class x : y
{
public Func<user, bool> SendStuffAction = SendStuff;
//overridden from y
public override bool SendStuff(user u)
{
//do stuff
}
}
Run Code Online (Sandbox Code Playgroud)
采用上面的代码,其中SendStuff是一个本地重写的实例方法,我得到一个上下文错误,SendStuff不是静态的.委托不能指向SendStuff方法所在的同一个类中的实例方法吗?
错误是:无法在非静态上下文中访问静态方法
如果该方法是私有的,为什么它不起作用怎么办?
private Func<user, bool> SendStuffAction = SendStuff;
Run Code Online (Sandbox Code Playgroud) 我已经读过,当你在类/对象上重写Equals时,你需要覆盖GetHashCode.
public class Person : IEquatable<Person>
{
public int PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public Person(int personId, string firstName, string lastName)
{
PersonId = personId;
FirstName = firstName;
LastName = lastName;
}
public bool Equals(Person obj)
{
Person p = obj as Person;
if (ReferenceEquals(null, p))
return false;
if (ReferenceEquals(this, p))
return true;
return Equals(p.FirstName, FirstName) &&
Equals(p.LastName, LastName);
}
}
Run Code Online (Sandbox Code Playgroud)
现在给出以下内容:
public static Dictionary<Person, Person> …Run Code Online (Sandbox Code Playgroud) 在CLR中通过c#第三版有一个我似乎无法理解的例子:
不变意味着无法更改泛型类型参数.到目前为止,我在本章中只显示了不变的泛型类型参数.ñ
Contravariant意味着泛型类型参数可以从类更改为从它派生的类.在C#中,使用in关键字指示逆变泛型类型参数.
逆变泛型类型参数只能出现在输入位置,例如方法的参数.n Covariant意味着泛型类型参数可以从类更改为其基类之一.在C#中,您使用out关键字指示协变泛型类型参数.协变泛型类型参数只能出现在输出位置,例如方法的返回类型.
然后作者继续给出这个例子:
public delegate TResult Func<in T, out TResult>(T arg);
Run Code Online (Sandbox Code Playgroud)
这里,泛型类型参数T用in关键字标记,使其成为逆变; 并且泛型类型参数TResult用out关键字标记,使其协变
这是我在下一页(292)遇到问题的地方,然后他继续使用界面说相反.
当使用带有泛型参数和返回值的委托时,建议在任何可能的情况下始终为逆变和协方差指定输入和输出关键字,因为这样做没有任何不良影响,并使您的委托可以在更多场景中使用.与委托一样,具有泛型类型参数的接口可以使其类型参数具有逆变性或协变性.以下是具有逆变>泛型类型参数的接口示例:
public interface IEnumerator<out T> : IEnumerator {
Boolean MoveNext();
T Current { get; }
}
Run Code Online (Sandbox Code Playgroud)
由于T是逆变的,因此可以成功编译和运行以下代码:
// This method accepts an IEnumerable of any reference type
Int32 Count(IEnumerable<Object> collection) { ... }
...
// The call below passes an IEnumerable<String> to Count
Int32 c = Count(new[] { "Grant" });
Run Code Online (Sandbox Code Playgroud)
在第二个例子中,他使用out关键字(IEnumerator<out T>)然后将其称为逆变量.这是正确的还是我错过了什么.在界面中定义逆变和协变是否有区别?我去过Oreilly的网站关于这本书,但没有列出.
我创建了一个可以从我的 Web 应用程序运行和访问的公共列表。
private static List<x> _x;
static readonly object lockObjx = new object();
public static void XCache()
{
if (_x != null)
return;
lock (lockObjx)
{
_x = GetFromDatabase();
}
}
Run Code Online (Sandbox Code Playgroud)
这一切都在默认应用程序池下愉快地运行。我现在需要添加一个可以更新此缓存的 Web 服务。我可以在默认应用程序池上运行此操作吗?如果没有,有没有办法可以在不安装 MEMCache 之类的情况下执行此操作。Service 和 Wepp 在同一服务器上运行。