小编flo*_*ode的帖子

将EqualityComparer <T>优先于IEqualityComparer <T>

IEqualityComparer<T>MSDN上的备注部分:

  1. 我们建议您从EqualityComparer <T>类派生而不是实现IEqualityComparer <T>接口,因为EqualityComparer <T>类使用IEquatable <T> .Equals方法而不是Object.Equals方法测试相等性....

    • 我不明白引用的论点,为什么我们宁愿从EqualityComparer<T>类而不是实现派生 IEqualityComparer<T>.它意味着实现的对象IEqualityComparer<T>将使用测试相等性Object.Equals,但是IEqualityComparer<T>当我们不想使用Object.Equals或测试相等性时,它不是实现的全部要点IEquatable<T>.Equals.

    • 它还暗示如果我们派生自EqualityComparer<T>,那么派生类将使用IEquatable<T>.Equals方法测试相等性.同样,这不是从EqualityComparer<T>我们不想使用Object.Equals或测试相等性的时候得到的全部内容IEquatable<T>.Equals(因为EqualityComparer<T>.Default已经使用Object.Equals或测试过IEquatable<T>.Equals)?

  2. ......这是符合的包含,的IndexOf,LastIndexOf和Remove字典<TKEY的,TValue>中类和其他泛型集合的方法.

    • 我假设.NET库中的大多数集合测试默认的元素相等(即当用户不IEqualityComparer<T>向这些集合提供自己的自定义对象时)通过调用IEquatable<T>.EqualsObject.Equals(取决于类型的元素是否T实现IEquatable<T>)来实现EqualityComparer<T>.Default.

    • 为什么这些集合(在测试默认相等时)不直接调用IEquatable<T>.EqualsObject.Equals直接调用EqualityComparer<T>.Default类?

.net c#

36
推荐指数
1
解决办法
4425
查看次数

NMTOKEN和NMTOKENS类型的用处是什么?

  1. 值的大小NMTOKEN遵循与XML名称相同的规则,但NMTOKEN任何允许的字符都可以是第一个字符.与XML string类型不同,NMTOKEN值不能包含任何空格.我仍然没有看到它的用处.

    那么我们何时以及为什么要使用NMTOKEN类型而不是string类型?

  2. NMTOKENS使我们能够NMTOKEN在一个字符串中指定多个值(由空格分隔).这种类型的意义更小,因为它还允许值包含空格字符,这实质上意味着NMTOKENS类型和string类型都可以包含完全相同的值.

    那么这种类型何时有用?

xsd

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

在什么情况下'out'参数有用(不能使用'ref'代替)?

据我所知,out参数的唯一用途是调用者可以从单个方法调用中获取多个返回值.但我们也可以使用ref参数获取多个结果值!

那么有没有其他情况下out参数可以证明是有用的,而我们不能使用ref参数呢?

谢谢.

c# out-parameters ref-parameters

18
推荐指数
2
解决办法
534
查看次数

Enumerable.Average和OverflowException

也许是一个无用的问题:

public static double Average<TSource>(
    this IEnumerable<TSource> source,
    Func<TSource, int> selector
)
Run Code Online (Sandbox Code Playgroud)

上述方法抛出的异常之一也是OverflowException:序列中元素的总和大于Int64.MaxValue.

我假设这个例外的原因是使用类型的变量S计算平均值的总和long?但由于返回值是类型double,为什么设计师没有选择制作S类型double

谢谢

c# linq

11
推荐指数
2
解决办法
550
查看次数

这是否会破坏拥有只读属性的整个目的?

我知道如何使用属性,我理解他们隐含地调用底层getset访问器,这取决于我们是写入还是读取属性.

static void Main(string[] args)
{
    A a = new A();
    (a.b).i = 100;

}

class A 
{
    private B _b = new B();
    public B b
    {
        get { return _b; }
    }
}
class B  
{
    public int i;
}
Run Code Online (Sandbox Code Playgroud)

代码(a.b).i = 100;基本上是第一个属性的get访问者返回对象的引用_b,一旦我们有了这个引用,我们就能够访问_b’s成员并更改它们的值.

因此,在我们的示例中,具有只读属性仅防止外部代码更改引用变量的值_b,但它不会阻止外部代码访问_b’s成员.

因此,似乎属性只能检测我们是否正在尝试读取或写入_b位于堆栈上的变量(在我们的案例变量中),而它无法检测我们是否也尝试写入对象的成员堆栈上的变量(假设此变量是引用类型)指向的.

a)但这不能破坏拥有只读属性的整个目的吗?如果属性能够检测我们是否正在尝试访问由get访问器返回的对象的成员(假设支持字段是引用类型),那会不会更有效?

谢谢

c# properties

10
推荐指数
6
解决办法
899
查看次数

如果A <T1,T2>是实际类型的模板,那么为什么允许使用typeof(A <,>)?

class Program
{
    static void Main(string[] args)
    {
        Type t = typeof(A<,>);
        Console.WriteLine(typeof(A<,>)); // prints A'2[T1,T2]
    }    
}

class A<T1,T2>
{

}
Run Code Online (Sandbox Code Playgroud)

据我所知,泛型类型A<T1, T2>不是实际类型,而是实际类型的蓝图/模板,所以为什么typeof接受它作为参数(因为据我所知,typeof接受作为参数实际类型)?

谢谢

c# generics

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

根据以下规则,表达式中的操作数是否被提升为更大的类型?

如果数值表达式包含不同数字类型的操作数(常量和变量),则根据以下规则将操作数提升为更大的类型:

  1. 如果操作数的类型byte,sbyte,char,short,ushort,他们得到转换成int键入
  2. 如果其中一个操作数是int,那么所有操作数都将转换为int
  3. 如果表达还包含的类型的操作数uintint,那么所有的操作数转换为long
  4. 如果其中一个操作数是long,那么所有操作数都将转换为long
  5. 如果表达式包含类型的操作数ulonglong,然后操作数转换为float
  6. 如果其中一个操作数是float,那么所有操作数都将转换为float
  7. 如果其中一个操作数是double,则所有操作数都转换为double

假设数值表达式包含不同类型的操作数,所有操作数首先会转换为单个数字类型,然后运行时才会尝试计算结果吗?例如,如果变量b1b2是的byte类型,而i1int类型,将b1和b2 get转换为int计算之前(b1+b2):

int i2=(b1+b2)+i1
Run Code Online (Sandbox Code Playgroud)

c# operators implicit-conversion

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

而不是错误,为什么两个操作数都不会被提升为float或double?

1)如果一个操作数是类型ulong,而另一个操作数是类型sbyte/short/int/long,则发生编译时错误.我没有看到这个逻辑.因此,为什么两个操作数都被提升为类型double或者float

        long L = 100;
        ulong UL = 1000;
        double d = L + UL; // error saying + operator can't be applied
                              to operands of type ulong and long
Run Code Online (Sandbox Code Playgroud)

b)编译器隐式地将int文字转换为byte类型并将结果值分配给b:

byte b = 1;
Run Code Online (Sandbox Code Playgroud)

但是,如果我们尝试分配一个文本类型的ulong输入long(或类型int,byte等等),那么编译器会报告错误:

long L = 1000UL;
Run Code Online (Sandbox Code Playgroud)

我认为编译器能够弄清楚常量表达式的结果是否适合类型的变量long?!

谢谢

c#

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

使用EventArgs/EventArgs <T>委托类型而不是...的事件的好处

我理解使用带签名的委托类型的事件的好处 delegate void delegate_name(object sender, EventArgs e)

a)但除了可以为我们节省一些打字这一事实之外,还有其他原因我们应该使用已定义的委托类型EventHandler/EventHandler<T>而不是使用签名声明我们自己的委托类型delegate void delegate_name(object sender, EventArgs e)吗?

b)我可以想到使用预定义委托类型的另外两个原因EventArgs/EventArgs<T>是:

  • 消费特定事件的人(比如说event EventHandler my_event)会立即知道如何使用该事件?

  • 也许一些流行的第三方方法接受作为参数EventHandler/ EventHandler<T>委托类型,因此如果我们的代码有可能使用这些第三方方法,我们应该使用预定义的委托EventHandler/Eventhandler<T>

谢谢

c# events

5
推荐指数
3
解决办法
1860
查看次数

这就是IEquatable <T>被引入的原因吗?

IEquatable<T>接口是否被引入的主要原因是因为它允许您执行与System.Object.Equals方法相同但不必执行强制转换?

谢谢

c#

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