从IEqualityComparer<T>MSDN上的备注部分:
我们建议您从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)?
......这是符合的包含,的IndexOf,LastIndexOf和Remove字典<TKEY的,TValue>中类和其他泛型集合的方法.
我假设.NET库中的大多数集合测试默认的元素相等(即当用户不IEqualityComparer<T>向这些集合提供自己的自定义对象时)通过调用IEquatable<T>.Equals或Object.Equals(取决于类型的元素是否T实现IEquatable<T>)来实现EqualityComparer<T>.Default.
为什么这些集合(在测试默认相等时)不直接调用IEquatable<T>.Equals或Object.Equals直接调用EqualityComparer<T>.Default类?
值的大小NMTOKEN遵循与XML名称相同的规则,但NMTOKEN任何允许的字符都可以是第一个字符.与XML string类型不同,NMTOKEN值不能包含任何空格.我仍然没有看到它的用处.
那么我们何时以及为什么要使用NMTOKEN类型而不是string类型?
NMTOKENS使我们能够NMTOKEN在一个字符串中指定多个值(由空格分隔).这种类型的意义更小,因为它还允许值包含空格字符,这实质上意味着NMTOKENS类型和string类型都可以包含完全相同的值.
那么这种类型何时有用?
据我所知,out参数的唯一用途是调用者可以从单个方法调用中获取多个返回值.但我们也可以使用ref参数获取多个结果值!
那么有没有其他情况下out参数可以证明是有用的,而我们不能使用ref参数呢?
谢谢.
也许是一个无用的问题:
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?
谢谢
我知道如何使用属性,我理解他们隐含地调用底层get和set访问器,这取决于我们是写入还是读取属性.
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访问器返回的对象的成员(假设支持字段是引用类型),那会不会更有效?
谢谢
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接受作为参数实际类型)?
谢谢
如果数值表达式包含不同数字类型的操作数(常量和变量),则根据以下规则将操作数提升为更大的类型:
byte,sbyte,char,short,ushort,他们得到转换成int键入int,那么所有操作数都将转换为intuint和int,那么所有的操作数转换为longlong,那么所有操作数都将转换为longulong和long,然后操作数转换为floatfloat,那么所有操作数都将转换为floatdouble,则所有操作数都转换为double假设数值表达式包含不同类型的操作数,所有操作数首先会转换为单个数字类型,然后运行时才会尝试计算结果吗?例如,如果变量b1和b2是的byte类型,而i1是int类型,将b1和b2 get转换为int计算之前(b1+b2):
int i2=(b1+b2)+i1
Run Code Online (Sandbox Code Playgroud) 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?!
谢谢
我理解使用带签名的委托类型的事件的好处 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>?
谢谢
IEquatable<T>接口是否被引入的主要原因是因为它允许您执行与System.Object.Equals方法相同但不必执行强制转换?
谢谢