下面我有两种方法,我想知道应该使用哪种方法?
方法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),
}
以上两种方法都能达到预期的效果,我只想了解两者的优缺点,我应该选择哪一种?
答案 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);
}
}