天道酬勤,学无止境

generics

Generic defined in unit breaking debug information

This must be a Delphi bug... I have a unit which is the basis of my persistance framework. In that unit I have a base class for all my domain objects, a list class and a generic list class. Just recently I noticed that when I step into the unit when debugging, execution will jump to a point a little further down in the file than it should... Maybe four or five lines. Re-ordering the file makes no difference. The code would also generate access violations, but only when I debugged it. I cast about trying to find the reason for this... Several things came to mind, like some code injection

2021-06-21 11:30:36    分类:问答    delphi   generics   delphi-2010

TStringList 与 TList(TStringList vs. TList<string>)

问题 使用标准有什么区别 type sl: TStringList 与使用通用 TList 相比 type sl: TList<string> ? 据我所知,两者的行为完全相同。 这只是做同样事情的另一种方式吗? 是否存在一种情况比另一种更好的情况? 谢谢! 回答1 TStringList 是 TStrings 的后代。 TStringList 知道如何按字母顺序对自身进行排序。 TStringList 有一个 Objects 属性。 TStringList 不会使您的代码与所有以前版本的 Delphi 不兼容。 TStringList 可以用作已发布的属性。 (目前有一个错误阻止了泛型类的发布。) 回答2 在泛型出现之前,TStringList 在 Delphi 中已经存在了很长时间。 因此,它构建了一些通用字符串列表不具备的有用功能。 泛型版本只是创建了一个与 TList 相同的新类型,该类型适用于 String 类型。 (.Add()、.Insert()、.Remove()、.Clear() 等) TStringList 具有基本的 TList 类型方法和其他自定义处理字符串的方法,例如 .SaveToFile() 和 .LoadFromFile() 如果你想要向后兼容,那么 TStringList 绝对是要走的路。 如果您想要使用字符串列表的增强功能,那么

2021-06-21 11:21:17    分类:技术分享    delphi   generics   tstringlist

IsAssignableFrom or AS?

I have next code: private T CreateInstance<T>(object obj) // where T : ISomeInterface, class { ... if (!typeof(T).IsAssignableFrom(obj.GetType())) { throw ..; } return (T)obj; } Can it be replaced with this: T result = obj as T; if (result == null) { throw ..; } return result; If not - why?

2021-06-21 11:15:22    分类:问答    c#   generics   inheritance   interface

C# 将泛型类作为事件参数传递(C# Passing generic class as an event parameter)

问题 在过去的几天里,我一直在使用泛型,我在尝试将泛型类型作为事件/委托中的参数传递时遇到了一个问题。 一位非常友好的堆栈成员可以为我上周五发布的一个关于泛型的问题带来一些启发。 但是,我想再次提出这个问题,因为我仍然不明白我应该如何使其正常工作。 在下面的代码中,您可以看到我有一个“目录”类,它可以引发一个事件,其中包含一个通用参数。 类“MainWindow”订阅了这个事件并且应该使用泛型参数。 这不起作用,因为事件必须指定委托的通用类型。 public class Catalog { #region EVENTS public delegate void GenericListItemCountChangedEvent<T>(object sender, GenericListItemCountChangedEventArgs<T> e) where T : BaseItem; //This is the point where it does not work, because I specify BaseItem as the type public event GenericListItemCountChangedEvent<BaseItem> GenericListItemCountChanged; private void

2021-06-21 11:08:04    分类:技术分享    c#   events   generics   arguments

C# 中类型安全的即发即弃异步委托调用(Typesafe fire-and-forget asynchronous delegate invocation in C#)

问题 我最近发现自己需要一种类型安全的“即发即忘”机制来异步运行代码。 理想情况下,我想做的是: var myAction = (Action)(() => Console.WriteLine("yada yada")); myAction.FireAndForget(); // async invocation 不幸的是,在没有相应EndInvoke() BeginInvoke()情况下调用BeginInvoke()的明显选择不起作用 - 它导致缓慢的资源泄漏(因为异步状态由运行时保持并且从未释放......它期望最终调用EndInvoke() .我也无法在.NET线程池上运行代码,因为它可能需要很长时间才能完成(建议只在线程池上运行生命周期相对较短的代码)——这使得它无法使用ThreadPool.QueueUserWorkItem() 。 最初,对于签名匹配Action 、 Action<...>或Func<...>方法,我只需要这种行为。 所以我整理了一组扩展方法(见下面的清单),让我在不遇到资源泄漏的情况下做到这一点。 每个版本的 Action/Func 都有重载。 不幸的是,我现在想将此代码移植到 .NET 4,其中 Action 和 Func 的通用参数数量已大幅增加。 在我编写 T4 脚本来生成这些之前,我还希望找到一种更简单更优雅的方法来做到这一点。 欢迎任何想法。

2021-06-21 10:52:20    分类:技术分享    c#   generics   asynchronous   delegates   .net-4.0

delphi 在 TDictionary 中使用记录作为键(delphi Using records as key in TDictionary)

问题 TDictionary 中可以使用记录作为 Key 值吗? 我想根据字符串、整数和整数的组合来查找对象。 TUserParKey=record App:string; ID:integer; Nr:integer; end; ... var tmpKey:TUserParKey; tmpObject:TObject; begin tmpObject:= TTObject.Create(1); tmpKey.App:='1'; tmpKey.ID :=1; tmpKey.Nr :=1; DTUserPars.Add(tmpKey,tmpObject) ... var tmpKey:TUserParKey; begin tmpKey.App:='1'; tmpKey.ID :=1; tmpKey.Nr :=1; if not DTUserPars.TryGetValue(tmpKey,Result) then begin result := TTObject.Create(2); end; 这将返回对象 2。 回答1 是的,您可以将记录用作 TDictionary 中的键,但您应该在创建字典时提供自己的 IEqualityComparer,因为记录的默认值只是对记录进行愚蠢的二进制比较。 这对于包含字符串的记录失败,因为它只是比较该字符串的指针,即使该字符串包含相同的值

2021-06-21 10:42:43    分类:技术分享    delphi   generics   collections   tdictionary

是否可以在派生 Generic 的记录数据类型中列出字段的名称和类型?(Is it possible to list the names and types of fields in a record data type that derives Generic?)

问题 我知道对于派生 Data.Data 的数据类型,constrFields 给出了字段名称列表。 查看 GHC.Generics 文档,我认为Generic也应该是可能的。 (但悲惨地未能弄清楚如何自己做)。 更具体地说,我正在寻找两件事: 列出所有记录字段 ... 在 Haskell 程序中。 我知道 aeson 能够自动推断派生Generic的任何记录数据类型的 JSON 表示,但阅读其源代码只能确认我在这里一无所知。 从我可以猜到,埃宋必须能够获得所有字段名(作为String S或ByteString S)从记录的数据类型,以及它们的类型(即具有类似类型TypeRep在Data.Typeable,或Eq实例:任何可用于case块模式匹配的东西都可以)。 我模糊地假设为M1 、 :*:等创建一个类和实例是方法,但我无法进入类型检查器。 检查记录选择器 要获取它所属的记录数据类型、记录字段名称(如String )等。 例如,给定 data Record = Record { recordId :: Int32 , recordName :: ByteString } deriving Generic 一个函数magic ,就像 typeOf (Record {}) == typeOf (magic recordId) 这些是否可以通过deriving Generic

2021-06-21 10:40:59    分类:技术分享    haskell   generics   type-systems   aeson

Java泛型方法覆盖(Java generics method overriding)

问题 我有接口: public interface CartService extends RemoteService{ <T extends ActionResponse> T execute(Action<T> action); } 我希望在实现中覆盖“执行”方法: public class XX implements CartService { @Override public <GetCartResponse> GetCartResponse execute(GetCart action) { // TODO Auto-generated method stub return null; } } 但收到编译器错误:XX 类型的方法 execute(GetCart) 必须覆盖或实现超类型方法 GetCart 和 GetCartResponse: public class GetCart implements Action<GetCartResponse>{ } public class GetCartResponse implements ActionResponse { private final ArrayList<CartItemRow> items; public GetCartResponse(ArrayList<CartItemRow> items) { this

2021-06-21 10:15:17    分类:技术分享    java   generics

java泛型:无法创建简单的打印数组方法(java generics: can't create a simple print array method)

问题 所以我继续在下一个代码中收到错误。 我不知道我做错了什么。 错误是类型 main 中的方法 printArray(T[]) 不适用于参数 (int[]) public class main { public static void main(String[] args) { Oefening1 oef = new Oefening1(); int[] integerArray = {1,2,3,4,5}; printArray(integerArray); } public static <T> void printArray(T[] arr){ for(T t: arr){ System.out.print(t + " "); } System.out.println(""); } } 回答1 谈到泛型,Java 在原始类型和从java.lang.Object派生的类型之间做出了区分。 只有非原始类型可以用作泛型方法的参数。 由于int不是通用的,所以printArray<T>不适用于它。 您可以通过为int提供重载或使integerArray成为Integer[]来修复它: Integer[] integerArray = {1,2,3,4,5}; printArray(integerArray); 演示。

2021-06-21 10:05:21    分类:技术分享    java   arrays   generics   printing

泛型方法中的隐式类型转换(implict type cast in generic method)

问题 为什么我在以下代码中收到编译器错误说明:即使 T 必须从我在 where 子句中定义的 NodeBase 派生,并且即使 SpecialNode 实际上是从 NodeBase 派生的,也Cannot implicty convert type SpecialNode to T ? public static T GetNode<T>() where T : NodeBase { if (typeof(T) == typeof(SpecialNode)) { return ThisStaticClass.MySpecialNode; // <-- compiler error } if (typeof(T) == typeof(OtherSpecialNode)) { return ThisStaticClass.MyOtherSpecialNode; // <-- compiler error } ... return default(T); } 回答1 编译器不会读取您的if检查以意识到在此特定行中, T必须是SpecialNode 。 您需要先转换到NodeBase ,如下所示: return (T)(NodeBase)MySpecialNode; 您需要强制转换,因为(据编译器所知) T可能是MyOtherSpecialNode

2021-06-21 09:53:16    分类:技术分享    c#   generics