c# – 不必要的转发给IComparer?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 不必要的转发给IComparer?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2215字,纯文字阅读大概需要4分钟。
内容图文
我理解如何使用IComparer接口和帮助程序类,它们提供自定义排序方法.例如,这是一个典型的例子,它非常像我在网上看到的所有例子,包括微软的在线帮助页面:
// This helper class is used to sort an array of people by name,
// where 'Person' is a class type.
public class PeopleNameComparer : IComparer
{
// Test the name of each object.
int IComparer.Compare(object o1, object o2)
{
Person p1 = o1 as Person;
Person p2 = o2 as Person;
if (p1 != null && p2 != null)
return string.Compare(p1.Name, p2.Name);
else
throw new ArgumentException("Parameter is not a Person!");
}
}
我也明白,如果我们有一个Person(myPeople)类型的数组,我们可以用这个数组排序:
Array.Sort(myPeople, new PeopleNameComparer());
在这种情况下,我们将创建一个新的PeopleNameComparer对象,该对象的类型为IComparer,并将其作为第二个参数传递给Array.Sort()方法.
现在为了使事情变得更整洁,我们可以实现一个属性来为对象用户提供一种更友好的方式来调用自定义排序:
public static IComparer SortByName
{ get { return (IComparer)new PeopleNameComparer(); } }
我不理解这种属性的原因是为什么当这个对象已经是IComparer类型时,所有的例子都使用(IComparer)强制转换将新创建的助手类(本例中的PeopleNameComparer)强制转换为IComparer对象?我试过没有演员表,代码似乎工作正常:
// This property seems to work fine without the cast?
public static IComparer SortByName
{ get { return new PeopleNameComparer(); } }
我可以理解,如果’new’关键字返回一个普通的System.Object类型,然后必须将其转换为适当的IComparer,但是在这里看不到需要进行转换.
但我遵循微软的例子,我的例子类似于我的Pro C#书中的一个例子.
有什么理由为什么在这里需要演员?
解决方法:
使用显式强制转换更明确.原谅这个真理……但就是这样.它有助于使代码更具可读性.
在某些情况下,如果有多个可能的选项,那么显式强制转换可以帮助运行时消除转换的歧义,但这似乎不会出现在返回类型中.只在表达式中.以下是一个常见示例,您需要在表达式中进行显式强制转换:
public class StringEnumerable : IEnumerable, IEnumerable<String>
{
IEnumerator<String> IEnumerable<String>.GetEnumerator()
{
yield return "TEST";
}
public IEnumerator GetEnumerator()
{
// without the explicit cast of `this` to the generic interface the
// method would call itself infinitely until a StackOverflowException occurs
return ((IEnumerable<String>)this).GetEnumerator();
}
}
如果从非泛型接口实现中删除显式强制转换,则会导致无限循环.
内容总结
以上是互联网集市为您收集整理的c# – 不必要的转发给IComparer?全部内容,希望文章能够帮你解决c# – 不必要的转发给IComparer?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。