小编Wes*_*ill的帖子

当GC移动对象时,Object.GetHashCode如何工作?

如果我理解正确,在.NET中,默认实现Object.GetHashCode()返回一个基于对象的内存地址的值(至少对于引用类型).但是,垃圾收集器可以在内存中自由移动对象.据推测,哈希代码不会因为GC移动对象而改变,所以这种交互是否有特殊处理,或者我的假设是错误的?

.net hashcode

23
推荐指数
1
解决办法
599
查看次数

如何查看优化的jitted .NET代码的反汇编?

出于这样或那样的原因,我有时会发现查看函数的优化编译器输出很有用或者很有趣.

对于非托管C/C++代码,我最喜欢的方法是在Release模式下编译,在感兴趣的函数中粘贴一个断点,运行,并在它到达断点时查看Visual Studio中的反汇编.

我最近尝试使用C#项目,并发现该技术不起作用.即使在Release模式下,我看到的反汇编显然也没有优化.我发现并禁用了(在Visual Studio 2010中)"调试...选项和设置...调试...常规...抑制模块加载时的JIT优化"选项,这可以让我更接近我想要的,只现在它在我尝试运行它时发出警告,然后我无法让它停在断点上以便我可以看到反汇编.

那么,如果我想看一个函数的CLR(4.0)抖动的反汇编优化输出,那么最好的方法是什么呢?为了清楚起见,我希望看到x86(或最好是x86_64)反汇编,而不仅仅是IL反汇编(你可以在Reflector中看到).

.net clr jit disassembly

17
推荐指数
1
解决办法
2601
查看次数

将依赖项注入测试

通常在使用依赖注入时,单元(和其他)测试负责创建/模拟被测系统的依赖关系并注入它们.

但是,有时测试本身具有依赖性,或者需要将依赖项注入到它本身无法创建的SUT中.例如,在测试与数据库交互的类时,测试需要知道连接字符串和目录名称等,这些不能被硬编码,因为对于运行测试的每个人来说它们不一定相同.

那么,您如何建议测试找出这些设置?一些xUnit风格的测试框架是否提供了一种为测试夹具提供依赖关系的方法?在运行所有测试之前,测试类是否应该填充静态属性?该测试是否应该忽略DI实践,只是从一些全球的地方获取依赖关系?其他建议?

unit-testing design-patterns dependency-injection

7
推荐指数
1
解决办法
183
查看次数

定制/任意数据库元数据

我认为一些反思管理环境(例如.NET)以属性的形式向代码实体添加自定义元数据的能力非常强大.是否存在为数据库执行类似操作的机制?

数据库显然已经拥有相当数量的元数据; 例如,您可以获取所有表,列和外键引用的列表,这足以将架构图放在一起.但是,我可以想象很多用于更通用的东西,例如C#和DDL这种想象中融合的东西:

[Obsolete("Being replaced by the ClientInteraction table")]
create table CustomerOrder (

    [SurrogateKey]
    MyTableId int identity(1,1) primary key

    [NaturalKey]
    [ForeignKey("Customer", "CustomerId")] /* Actual constraint left out for speed */
   ,CustomerId int not null

    [NaturalKey]
    [ConsiderAsNull(0)]
    [ConsiderAsNull(-1)]
   ,OrderId int not null

    [Conditional("DEBUG")]
   ,InsertDateTime datetime
)
Run Code Online (Sandbox Code Playgroud)

这个例子有点做作,但希望我的问题更清楚.我认为反映这种元数据的能力可以使许多任务更容易实现自动化.那里有这样的东西吗?我正在使用SQL Server,但如果有其他DBMS的东西,那么我仍然有兴趣听到它.

database sql-server reflection metadata

5
推荐指数
1
解决办法
1737
查看次数

是否可以仅使用值类型创建参考周期?

作为解释,请在C#中使用此值类型:

struct ObjRef
{
    public object Value;
    public ObjRef(object value) { Value = value; }
}
Run Code Online (Sandbox Code Playgroud)

我可以想象一个对象图,其中有两个这种类型的盒装实例,每个实例都包含对另一个的引用.这就是我所说的仅具有值类型的引用循环.

我的问题是这样的对象图是否可以在.NET中构建.从概念上讲,如果存在,构造将如下所示:

object left = new ObjRef();
object right = new ObjRef(left);
left.Value = right;
Run Code Online (Sandbox Code Playgroud)

但显然,最后一行没有有效的C#.制作最后一行:

((ObjRef)left).Value = right;
Run Code Online (Sandbox Code Playgroud)

没有达到结果,因为强制转换left,你最终会改变副本.所以至少在直接的C#中,它看起来不像是可能的.

有人知道是否可以使用反射,不安全代码dynamic,IL代码或任何其他方式实现构造?或者,任何人都可以证明CLR有效地阻止了这样的参考周期吗?

请注意,我实际上并不想创建这样的对象图.相反,答案可能会影响与对象图一起使用的算法的设计,例如序列化/反序列化格式化程序.


编辑

正如Brian建议的那样,确实可以通过将其转换为接口类型而不是值类型来修改盒装值而不将其取消装箱.所以给出这段代码:

interface IObjRef
{
    IObjRef Value { get; set; }
}

struct ObjRef : IObjRef
{
    IObjRef value;
    public IObjRef Value { get { return value; } set { this.value = value; } …
Run Code Online (Sandbox Code Playgroud)

.net serialization struct reference value-type

5
推荐指数
1
解决办法
209
查看次数

C#中的混凝土二传手抽象吸气剂

我正在尝试为实现的只读集合编写一个抽象基类IList.这样的基类应该实现set-indexer来抛出a NotSupportedException,但是将get-indexer保留为abstract.C#是否允许这种情况?这是我到目前为止所拥有的:

public abstract class ReadOnlyList : IList {

    public bool IsReadOnly { get { return true; } }

    public object this[int index] {
        get {
            // there is nothing to put here! Ideally it would be left abstract.
            throw new NotImplementedException();
        }
        set {
            throw new NotSupportedException("The collection is read-only.");
        }
    }

    // other members of IList ...
}
Run Code Online (Sandbox Code Playgroud)

理想情况下ReadOnlyList,能够实现setter,但保留getter摘要.有没有允许这个的语法?

c#

5
推荐指数
1
解决办法
1522
查看次数

从ReplaceFile重现ERROR_UNABLE_TO_MOVE_REPLACEMENT_2错误代码

我使用ReplaceFile Win32函数作为获取原子行为的操作的一部分.

在该函数的三个特殊错误代码中,我已经能够从两个重现和恢复(回滚):ERROR_UNABLE_TO_MOVE_REPLACEMENT和ERROR_UNABLE_TO_REMOVE_REPLACED.

我的问题与第三个错误代码有关:ERROR_UNABLE_TO_MOVE_REPLACEMENT _2.

  1. 有没有人看到这个错误代码返回?在什么条件下可能?
  2. 有关如何重新生成此错误的任何想法,以便我可以测试从我的代码中恢复的路径?
  3. 我从文档中收集到要从此错误中恢复(回滚),我需要将替换后的文件重命名为其原始名称,因为ReplaceFile会将其留下备份文件名.任何人都可以验证这实际上是ReplaceFile离开文件的状态吗?

如果有帮助,可以提供更多细节:

  • 使用非NULL备份文件名调用ReplaceFile(实际上,如果给出NULL备份名称,则不会发生ERROR_UNABLE_TO_MOVE_REPLACEMENT_2).
  • 我还传递了REPLACEFILE_WRITE_THROUGH标志.
  • 这些文件都存在于同一个NTFS卷上.

windows error-handling winapi error-code

5
推荐指数
1
解决办法
451
查看次数