C#接口和泛型

C# 中的接口(interface)是一种用于定义一组相关方法、属性和事件的结构。接口可以被类实现,从而强制类提供接口中定义的功能。在 C# 中,接口使用 interface 关键字来声明。

一、公共接口

有一些常见的公共接口被广泛使用。以下是其中一些常见的公共接口

接口说明
IEnumerableIEnumerable 接口允许对象支持在集合上进行简单迭代。它包含一个返回枚举器的方法,使得集合能够被 foreach 语句遍历。
IListIList 接口表示一个可以按索引访问的对象列表。它扩展了 ICollection 接口,提供了对列表中元素的添加、移除和查找等操作。
IDisposableIDisposable 接口定义了一种用于释放非托管资源的模式。通过实现该接口,对象可以显式地释放资源,而不依赖于垃圾回收器。
INotifyPropertyChangedINotifyPropertyChanged 接口通常用于实现数据绑定机制,允许对象通知绑定到它的客户端关于属性值更改的信息。
IComparable 和 IComparerIComparable 接口定义了对象的比较方法,而 IComparer 接口允许自定义的比较器来进行排序操作。
IDbConnection 和 IDbCommand这两个接口是用于数据库访问的接口,分别表示数据库连接和命令执行。

排序时比较对象
IComparable 接口是 C# 中的一个公共接口,用于比较对象的顺序。实现了 IComparable 接口的类可以进行可靠的排序和比较操作。该接口定义了一个 CompareTo 方法,允许将对象与另一个对象进行比较,并返回一个表示它们相对顺序的值。

public class Person : IComparable
{
    public string Name { get; set; }
    public int Age { get; set; }
    public int CompareTo(object obj)
    {
        if (obj == null) return 1;
        Person otherPerson = obj as Person;
        if (otherPerson != null)
        {
            return this.Age.CompareTo(otherPerson.Age);
        }
        else
        {
            throw new ArgumentException("Object is not a Person");
        }
    }
}
public class Program
{
    static void Main()
    {
        Person person1 = new Person { Name = "Alice", Age = 25 };
        Person person2 = new Person { Name = "Bob", Age = 30 };
        int result = person1.CompareTo(person2);
        if (result < 0)
            Console.WriteLine($"{person1.Name} is younger than {person2.Name}");
        else if (result > 0)
            Console.WriteLine($"{person1.Name} is older than {person2.Name}");
        else
            Console.WriteLine($"{person1.Name} and {person2.Name} are the same age");
    }
}

在这个示例中,Person 类实现了 IComparable 接口,定义了 CompareTo 方法来比较两个人的年龄。然后在 Main 方法中,我们调用 CompareTo 方法来比较两个 Person 对象的年龄。

二、使用默认实现定义接口

从 C# 8.0 开始,可以使用默认实现来定义接口。这意味着你可以在接口中包含方法的默认实现,从而在接口的所有实现类中共享相同的逻辑。

public interface ILogger
{
    void Log(string message);
    // 默认实现
    public void LogError(string errorMessage)
    {
        Console.WriteLine($"Error: {errorMessage}");
    }
}

三、使类型可以安全地与泛型一起重用

可以使用泛型类型来创建具有通用性的类和方法,从而实现对不同数据类型的操作。
通过使用泛型类型,可以创建更加灵活、可重用的代码,同时避免了对不同数据类型的重复编写。

  1. 使用泛型类
public class MyGenericClass<T>
{
    private T _genericMember;
    public MyGenericClass(T value)
    {
        _genericMember = value;
    }
    public T GenericMethod(T parameter)
    {
        // 进行与T相关的操作
        return parameter;
    }
}

MyGenericClass 是一个泛型类,其中的 T 是泛型类型参数。它包含一个泛型成员和一个泛型方法,可以针对不同的类型进行操作。

  1. 使用泛型方法
public T Max<T>(T x, T y) where T : IComparable<T>
{
    return x.CompareTo(y) > 0 ? x : y;
}

泛型方法 Max,它可以接受任何实现了 IComparable 接口的类型,并返回两个值中较大的那个。

  1. 使用泛型接口
public interface IRepository<T>
{
    T GetById(int id);
    void Save(T entity);
}

IRepository 是一个泛型接口,定义了对某种类型的数据进行获取和保存的操作。

希望以上信息能够对你理解 C# 中的接口和泛型类型有所帮助。接口和泛型为编写灵活、可重用的代码提供了强大的工具,同时也是 C# 语言中非常重要的特性之一。如果你有任何其他问题或者需要进一步的帮助,请随时告诉我。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林祖师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值