在以下上下文中我应该使用什么 - 方法重载或使用泛型?

What should I use in following context - Method Overloading or Using generics?

我有下面两种方法,我想知道我应该使用哪种?

方法 1:使用重载

public Color GetColor(int? Id)
        {
            return db.Colors.Find(Id);
        }
        public Color GetColor(string Name)
        {
            return db.Colors.Where(m => m.Name == Name).FirstOrDefault();
        }

方法 2:使用泛型

 public Color GetColor<T>(T value)
        {
            var type = value.GetType();

            if (type == typeof(Int32))
            {
                return db.Colors.Find(value); // Data fetched using Id
            }
            else if (type == typeof(string))
            {
                return db.Colors.Where(m => m.Name == value.ToString()).FirstOrDefault();  // Data fetched using name
            }
            return null;
        }

以上两种方法都得到了想要的结果,我只想知道两者的优缺点,我应该更喜欢哪种?

当您想编写一段代码时,泛型非常有用,嗯,泛型,但保留类型安全。例如,无论列表包含什么,添加到列表都具有完全相同的代码,但您只能将字符串添加到字符串列表。

在您分享的第二个代码片段中,代码绝非通用 - 它明确检查传递给它的参数类型(在运行时!),并且仅处理字符串和整数。此代码段确实没有任何好处,您最好像第一个代码段一样坚持使用重载变体。

我知道不是每个人都以这种方式编写代码,但我觉得代码应该尽可能地展示程序员的意图。方法签名通常应提供足够的信息,而无需其他注释等来指示该方法的作用。

我反对像这样使用泛型,因为它不传达这种信息。由于它采用不受约束的通用参数 T,因此可能会得出结论,任何对象都可以传递给您的通用方法,并且它将 return 一种颜色。事实上,如果此代码位于封闭源代码库中,调用者如何知道实际实现的功能?

重载方法在这方面更胜一筹。它们清楚地传达了意图并按照您的预期工作,而无需深入研究其源代码以了解它们的工作原理。

至于性能,重载会更好,因为方法重载将在编译时选择。相比之下,泛型方法仅限于在运行时检查提供的类型,这会比较慢。

如果我们需要以不同的方式(即针对不同的输入)执行相同类型的操作,我们通常会使用重载。

我觉得如果你用不同的输入进行操作会更好

public int add(int a, int b)  //two int type Parameters method  
{    
    return a + b;    

}    
public int add(int a, int b,int c)  //three int type Parameters with same method same as above  
{    
    return a + b+c;    

}    
public float add(float a, float b,float c,float d)  //four float type Parameters with same method same as above two method 
{    
    return a + b+c+d;    

}  

C# 中的泛型是其最强大的功能。它允许您定义 type-safe 数据结构。 out-turn 显着提升了性能和 high-grade 代码,因为它有助于重用数据处理算法而无需复制 type-specific 代码。

我认为通用的class最好用于class将class定义为泛型并减少其代码,但上面使用的方法似乎并没有减少您的代码.

 public class GenericRepository<TEntity> where TEntity : class
{
    internal BlogContext blogContextlog;
    internal DbSet<TEntity> dbSet;

    public GenericRepository(BlogContext context)
    {
        this.blogContextlog = context;
        this.dbSet = context.Set<TEntity>();
    }

    public virtual IEnumerable<TEntity> Get()
    {
        IQueryable<TEntity> query = blogContextlog.Set<TEntity>().ToList();
    }

    public virtual TEntity GetByID(object id)
    {
        return blogContextlog.Find(id);
    }
}