小编Dan*_*ker的帖子

Object.Equals:默认情况下一切都是相同的

通过C#第4版(微软出版社)阅读Jeffrey Richter的CLR时,作者曾指出,虽然Object.Equals目前检查身份相同,但Microsoft 应该实现如下方法:

public class Object {
    public virtual Boolean Equals(Object obj) {
        // The given object to compare to can't be null
        if (obj == null) return false;

        // If objects are different types, they can't be equal.
        if (this.GetType() != obj.GetType()) return false;

        // If objects are same type, return true if all of their fields match
        // Because System.Object defines no fields, the fields match
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

这让我很奇怪:默认情况下 …

c# equality equals

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

对.NET中未对齐字段的读写是绝对原子的吗?

C#规范(ECMA-334ISO/IEC 23270)有一段关于读写的原子性:

12.5变量引用的原子性

以下数据类型的读取和写入应为原子:bool,char,byte,sbyte,short,ushort,uint,int,float和reference类型.此外,在先前列表中具有基础类型的枚举类型的读取和写入也应该是原子的.其他类型的读写,包括long,ulong,double和decimal,以及用户定义的类型,不一定是原子的.

但我很难想象永远是真的.例如,我可以使用StructLayout属性布局结构,并强制字段不对齐:

// sizeof(MyStruct) == 9
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct MyStruct
{
    public byte pad;   // Offset: 0
    public int value1; // Offset: 1
    public int value2; // Offset: 5
}
Run Code Online (Sandbox Code Playgroud)

现在,当我这样做,我会觉得写的int不是原子的,因为它没有对齐的自然边界:

MyStruct myStruct = new MyStruct();
myStruct.value1 = 20;
Run Code Online (Sandbox Code Playgroud)

那么,它是绝对原子的(就像规范所说的那样),还是不能保证是原子的(例如在x86上)?无论哪种方式,你有任何消息来支持这个吗?

.net c# atomic memory-alignment

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

使用基类IEqualityComparer做Distinct(),仍然返回子类类型?

我有许多是从类派生的类BaseClass,其中BaseClass仅仅有一个'ID属性.

我现在需要对其中一些对象的集合进行区分.我为每个子类反复提供以下代码:

public class PositionComparer : IEqualityComparer<Position>
{
    public bool Equals(Position x, Position y)
    {
        return (x.Id == y.Id);
    }

    public int GetHashCode(Position obj)
    {
        return obj.Id.GetHashCode();
    }
}
Run Code Online (Sandbox Code Playgroud)

鉴于逻辑只是基于Id,我想创建一个单一的比较器来减少重复:

public class BaseClassComparer : IEqualityComparer<BaseClass>
{
    public bool Equals(BaseClass x, BaseClass y)
    {
        return (x.Id == y.Id);
    }

    public int GetHashCode(BaseClass obj)
    {
        return obj.Id.GetHashCode();
    }
}
Run Code Online (Sandbox Code Playgroud)

但这似乎没有编译:

  IEnumerable<Position> positions = GetAllPositions();
  positions = allPositions.Distinct(new BaseClassComparer())
Run Code Online (Sandbox Code Playgroud)

...因为它说它无法转换BaseClassPosition.为什么比较器会强制执行此Distinct()调用的返回值?

c# linq distinct iequalitycomparer

7
推荐指数
2
解决办法
1080
查看次数

转换泛型参数与'where'类型约束不可能?

我有一个基类:

public abstract class DomainEventSubscriber<T> where T : DomainEvent
{
    public abstract void HandleEvent(T domainEvent);
    public Type SubscribedToEventType() { return typeof(T); }
}
Run Code Online (Sandbox Code Playgroud)

还有一个存储DomainEventSubscriber引用的类:

public class DomainEventPublisher
{
    private List<DomainEventSubscriber<DomainEvent>> subscribers;

    public void Subscribe<T>(DomainEventSubscriber<T> subscriber)
        where T : DomainEvent
    {
        DomainEventSubscriber<DomainEvent> eventSubscriber;
        eventSubscriber = (DomainEventSubscriber<DomainEvent>)subscriber;

        if (!this.Publishing)
        {
            this.subscribers.Add(eventSubscriber);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

即使Subscribe方法类型受到限制,我也无法转换DomainEventSubscriber<T> subscriber where T : DomainEventDomainEventSubscriber<DomainEvent>:

eventSubscriber = (DomainEventSubscriber<DomainEvent>)subscriber;
Run Code Online (Sandbox Code Playgroud)

我将如何进行这种转换,或者我是否为一个令人讨厌的代码味道做好准备?

c# generics

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

为什么最后调用GC.KeepAlive,而不是在开头?

来自GC.KeepAlive()MSDN:

obj必须可用的指令范围的最后(而不是开头)编码此方法.

为什么会出现这种非直观的行为?

.net c# garbage-collection

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

为什么"不能从类型变量中选择"

我有以下课程:

public abstract class A {

    public String att;

    public static abstract class Builder<T extends A> {

        public T a;

        public abstract T build();

        public T.Builder setAtt(String a) {
            this.a.att = a;
            return this;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


public class A1 extends A {

    public static class Builder extends A.Builder<A1> {

        public Builder() {
            this.a = new A1();
        }

        public A1 build() {
            return this.a;
        }
    }
} 
Run Code Online (Sandbox Code Playgroud)


public class A2 extends A {

    public String subAtt;

    public static class Builder …
Run Code Online (Sandbox Code Playgroud)

java generics builder

7
推荐指数
2
解决办法
3375
查看次数

ulong和long之间的不可能比较突然可能

我知道为什么不允许这样做:

ulong x = 0xFEDCBA9876543210;
long y = Int64.MaxValue;
Console.WriteLine(x < y);
Run Code Online (Sandbox Code Playgroud)

显然,运行时无法将操作数隐式转换为其他类型或更大的类型以使比较起作用.

运算符'<'不能应用于'ulong'和'long'类型的操作数.

所以,这也是不允许的(带MinValueconst):

ulong x = 0xFEDCBA9876543210;
const long y = Int64.MinValue;
Console.WriteLine(x < y);
Run Code Online (Sandbox Code Playgroud)

然而,这是允许的(MaxValue相反):

ulong x = 0xFEDCBA9876543210;
const long y = Int64.MaxValue;
Console.WriteLine(x < y);
Run Code Online (Sandbox Code Playgroud)

<接受a ulong并没有过载long,但是我看到Reflector它会默默地转换Int64.MaxValue为a ulong.但这并不总是发生.它是如何工作的,以及这种不一致的原因是什么?

c# casting comparison-operators long-integer

6
推荐指数
1
解决办法
1143
查看次数

Array.IStructuralEquatable.GetHashCode中的错误?

在编写我自己的ByteArray内部使用字节数组的不可变类时,我实现了IStructuralEquatable接口.在我的实现中,我将计算哈希码的任务委托给内部数组.在测试它时,令我惊讶的是,我发现我的两个不同的数组具有相同的结构哈希码,即它们返回相同的值GetHashCode.重现:

IStructuralEquatable array11 = new int[] { 1, 1 };
IStructuralEquatable array12 = new int[] { 1, 2 };
IStructuralEquatable array22 = new int[] { 2, 2 };

var comparer = EqualityComparer<int>.Default;
Console.WriteLine(array11.GetHashCode(comparer));     // 32
Console.WriteLine(array12.GetHashCode(comparer));     // 32
Console.WriteLine(array22.GetHashCode(comparer));     // 64
Run Code Online (Sandbox Code Playgroud)

IStructuralEquatable是一个非常新的和未知的,但我在某处读到它可以用来比较集合和数组的内容.我错了,还是我的.Net错了?

请注意,我不是在谈论Object.GetHashCode!

编辑:所以,我显然是错的,因为不等对象可能有相同的哈希码.但是,不是要求GetHashCode一组有点随机分布的值作为要求吗?经过一些测试后,我发现任何两个具有相同第一个元素的数组都具有相同的哈希值.我仍然认为这是一种奇怪的行为.

c# gethashcode

6
推荐指数
2
解决办法
805
查看次数

使用laravel Blade嵌套视图

我搜索了SO,并在Laravel文档中挖了但是我不确定我是否完全理解我想做什么.

我正在使用Laravel 4.我想知道如何在其他视图中嵌套视图.

例如,我有一个基本布局..让我们调用它 layout.blade.php

<html>
    <head>
      <title>{{ $title }}</title>
    </head>
    <body>
        @yield('nav')  
        @yield('content')
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

接下来我有一个页面的刀片home:

@extends('layout')

@section('nav')
<p>NAVIGATION</P>
@end

@section('content')
<p>HELLO WORLD!</P>
@end
Run Code Online (Sandbox Code Playgroud)

我有几个不同的导航布局,一个用于管理员,另一个用于超级用户,另一个用于普通用户.

有没有办法在里面添加另一个刀片视图section('nav')

@section('nav')
// do something magical here?
@end
Run Code Online (Sandbox Code Playgroud)

对于每个刀片布局而言,当重复使用多个片段时,我需要重复导航代码是没有意义的.

laravel blade laravel-4

6
推荐指数
2
解决办法
1万
查看次数

如何显示(或写入文件)希腊字符?

如何使用C#显示(或写入文件)希腊字符?我需要使用C#在Excel中键入希腊字符epsilon.要写的字符串也有英文字符.例如:

在此输入图像描述

.net c# string

6
推荐指数
1
解决办法
1万
查看次数