在以下情况下应该使用什么-方法重载或使用泛型?

时间:2019-06-19 05:21:25

标签: c# generics overloading

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

方法1:使用重载

str

方法2:使用泛型

import pandas as pd

df = pd.read_excel(
    './myexcel.xlsx',
    converters={
        "serialno": str, # Ensure serialno is read as string, maintaining leading 0's
        "location": lambda x: '-' if x=='' else str(x),
    }

df1 = pd.read_excel(
    './mycsv.csv',
    converters={
        "serialno": str, # Ensure serialno is read as string, maintaining leading 0's
        "location": lambda x: '-' if x=='' else str(x),
    }

以上两种方法都能达到预期的效果,我只想了解两者的优缺点,我应该选择哪一种?

3 个答案:

答案 0 :(得分:5)

泛型对于想要编写一段代码的情况很有用,尽管如此,泛型但又保留了类型安全性。例如,无论列表包含什么内容,添加到列表中的代码都完全相同,但是您只能将字符串添加到字符串列表中。

在第二个代码段中,您共享的代码不是通用代码-它显式检查传递给它的参数的类型(在运行时!),并且仅处理字符串和整数。此代码段确实没有任何弊端,最好还是像第一个代码段那样坚持重载版本。

答案 1 :(得分:4)

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

我反对使用这样的泛型,因为它不传达此类信息。由于它采用不受约束的通用参数T,因此可以得出结论,任何对象都可以传递给通用方法,并且它将返回颜色。的确,如果这段代码在一个封闭的源库中,调用者将如何知道实际的实现呢?

在这方面,重载方法是优越的。它们可以清楚地传达意图并按您期望的方式工作,而不必深入研究源代码以了解其工作原理。

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

答案 2 :(得分:0)

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

我认为最好用不同的输入进行操作

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#中的泛型是它最强大的功能。它允许您定义类型安全的数据结构。这种结果极大地提高了性能和提供了高级代码,因为它有助于重用数据处理算法,而无需复制特定于类型的代码。

我认为一般类最好用于将其归类为通用类并减少其代码,但是上面使用的方法似乎并不能减少您的代码。

 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);
    }
}