在以下上下文中我应该使用什么 - 方法重载或使用泛型?
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);
}
}
我有下面两种方法,我想知道我应该使用哪种?
方法 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);
}
}