Tag: generics

如何为给定的Type创建实例?

有了generics,你可以 var object = default(T); 但是当你拥有的只是一个Type实例时,我只能这样做 constructor = type.GetConstructor(Type.EmptyTypes); var parameters = new object[0]; var obj = constructor.Invoke(parameters); 甚至 var obj = type.GetConstructor(Type.EmptyTypes).Invoke(new object[0]); 是不是有更短的方式,如generics版本?

为什么将List 转换为IList 导致性能降低?

我正在做一些性能指标,我遇到了一些对我来说很奇怪的事情。 我计时以下两个function: private static void DoOne() { List A = new List(); for (int i = 0; i < 200; i++) A.Add(i); int s=0; for (int j = 0; j < 100000; j++) { for (int c = 0; c < A.Count; c++) s += A[c]; } } private static void DoTwo() { List A […]

具有inheritance的Builder设计模式:有更好的方法吗?

我正在创建一系列构建器来清理语法,为我的模拟创建域类,作为改进整体unit testing的一部分。 我的构建器基本上填充了一个域类(例如一个Schedule ),其中一些值通过调用适当的WithXXX并将它们链接在一起来确定。 我在构建器中遇到了一些共性,我想将它抽象到基类中以增加代码重用。 不幸的是,我最终看起来像: public abstract class BaseBuilder where BLDR : BaseBuilder where T : new() { public abstract T Build(); protected int Id { get; private set; } protected abstract BLDR This { get; } public BLDR WithId(int id) { Id = id; return This; } } 特别注意protected abstract BLDR This { […]

Func 的性能和inheritance

在使用inheritance和generics时,我一直无法理解在整个代码中使用Func的性能特征 – 这是我发现自己一直使用的组合。 让我从一个最小的测试用例开始,这样我们都知道我们在谈论什么,然后我会发布结果,然后我将解释我期望的内容以及为什么…… 最小的测试用例 public class GenericsTest2 : GenericsTest { static void Main(string[] args) { GenericsTest2 at = new GenericsTest2(); at.test(at.func); at.test(at.Check); at.test(at.func2); at.test(at.Check2); at.test((a) => a.Equals(default(int))); Console.ReadLine(); } public GenericsTest2() { func = func2 = (a) => Check(a); } protected Func func2; public bool Check2(int value) { return value.Equals(default(int)); } public void test(Func […]

如何在C#中为测量单位创建通用转换器?

在一个涉及温度转换的小型烹饪项目以及一些烹饪测量转换(如Imperial to Metric)的过程中,我一直在努力学习更多关于代表和lambdas的知识,我一直试图想办法制作一个可扩展的单位转换器。 这是我开始时的内容,以及关于我的一些计划的代码评论。 我没有计划像下面这样使用它,我只是测试了C#的一些function我不太了解,我也不确定如何进一步采取这一点。 有没有人对如何在下面的评论中创建我正在谈论的内容有任何建议? 谢谢 namespace TemperatureConverter { class Program { static void Main(string[] args) { // Fahrenheit to Celsius : [°C] = ([°F] − 32) × 5⁄9 var CelsiusResult = Converter.Convert(11M,Converter.FahrenheitToCelsius); // Celsius to Fahrenheit : [°F] = [°C] × 9⁄5 + 32 var FahrenheitResult = Converter.Convert(11M, Converter.CelsiusToFahrenheit); Console.WriteLine(“Fahrenheit to Celsius : […]

为什么基类规范的含义在C#中递归依赖于它自身?

以下C#代码无法编译: public class A { public interface B { } } public class C : A, CB // Error given here: The type name ‘B’ does not exist in the type ‘C’. { } public class D : CB // Compiles without problems if we comment out ‘CB’ above. { } 根据C#4.0规范(第10.1.4.1段),此行为是正确的: 在确定B类的直接基类规范A的含义时,暂时假定B的直接基类是对象。 直观地,这确保了基类规范的含义不能递归地依赖于它自己。 我的问题是:为什么不允许这种行为? […]

打开通用接口方法的委托

我正在尝试为通用接口方法创建一个打开的实例委托 ,但我一直收到NotSupportedException。 以下是无法运行的简化代码: interface IFoo { void Bar(T j); } class Foo : IFoo { public void Bar(T j) { } } static void Main(string[] args) { var bar = typeof(IFoo).GetMethod(“Bar”).MakeGenericMethod(typeof(int)); var x = Delegate.CreateDelegate(typeof(Action), null, bar); } 最后一行抛出NotSupportedException,“不支持指定的方法”。 相比之下,非通用的开放实例委托运行良好: interface IFoo { void Bar(int j); } class Foo : IFoo { public void Bar(int […]

如何对Generic List Asc或Desc进行排序?

我有一个类型为MyImageClass的generics集合,而MyImageClass有一个布尔属性“IsProfile”。 我想对这个通用列表进行排序,其中IsProfile == true代表列表的开头。 我试过这个。 rptBigImages.DataSource = estate.Images.OrderBy(est=>est.IsProfile).ToList(); 使用上面的代码,最后一个IsProfile属性为true。 但我希望它成为第一个指数。 我需要一些Asc或Desc 。 然后我做了这个。 rptBigImages.DataSource = estate.Images.OrderBy(est=>est.IsProfile).Reverse.ToList(); 有没有更简单的方法来做到这一点? 谢谢

generics如何影响C#和.NET的设计?

这可能是一个广泛的问题,但这是我不太清楚和非常好奇的事情。 通常,对于某些问题,我听到的原因是因为Generics在.NET 1.0中不可用。 这让我想到以下两件事之一: 之前没有想到generics,所以开发人员在.NET 1.0之后提出它可能会对C#和.NET的设计产生巨大影响,但由于已做出的决定(向后兼容性)而无法实现。 generics从一开始就一直在计划中,因此不使用.NET 1.0发布的唯一问题是无法在2.0之前使用它。 但除此之外,没有引入或错误的冗余function,提出了不可逆转的决定。 我主要假设#1,但实际情况是#2?

通过List 删除不需要的对象的最简单方法是什么?

在我的应用程序中,_collection是一个List,我需要从中删除所有与条件不匹配的User对象 。 但是,以下代码在其第二次迭代中获取无效操作错误,因为_collection本身已更改: foreach (User user in _collection) { if (!user.IsApproved()) { _collection.Remove(user); } } 我可以创建另一个List集合并来回复制它们,但后来我遇到了非克隆引用类型等问题。 有没有办法比将_collection复制到另一个另一个List变量更优雅?