C#初学者求助:如何正确初始化out参数并返回类实例?
C#泛型TryReceive方法实现问题
作为C#初学者,我在使用out参数并返回消息实例的操作上存在困惑。我需要调用Deserialize方法,若反序列化成功则返回bool值并初始化类实例,但不知该如何实现。
任务说明
- 泛型方法TryReceive的泛型类型需限制为实现IMessage接口且拥有公共无参构造函数的对象
- 方法接收序列化消息文本作为输入参数,输出参数类型为方法的泛型类型,返回表示操作成功与否的bool值
- 遍历RegisterSerializer方法中注册的对象,查找类型为MessageSerializer
(T为TryReceive的泛型类型)的对象,调用其Deserialize方法(参数为序列化文本) - 若反序列化成功(未抛出InvalidMessageException异常),则返回反序列化后的消息并终止方法;若失败则继续查找下一个合适的对象
调用代码
if (mailbox.TryReceive(txt, out Message message)) { Console.WriteLine("TEXT MESSAGE:"); Console.WriteLine(message.Text); }
我的实现代码
public bool TryReceive<T>(string serzText, out T param) where T : IMessage, new() { foreach (MessageSerializerBase Obj in list) { if (Obj is MessageSerializer<T> temp) { param.Deserialize(serzText); param = temp; return true; } } return false; }
修正后的实现代码及说明
你的代码存在几个关键问题,以下是修正后的版本:
public bool TryReceive<T>(string serzText, out T param) where T : IMessage, new() { // 初始化out参数,满足C#语法要求(out参数必须在所有路径被赋值) param = new T(); foreach (MessageSerializerBase obj in list) { if (obj is MessageSerializer<T> serializer) { try { // 调用序列化器的Deserialize方法,获取反序列化后的消息实例 param = serializer.Deserialize(serzText); return true; } catch (InvalidMessageException) { // 反序列化失败,跳过当前序列化器,继续查找下一个 continue; } } } // 未找到合适的序列化器或全部反序列化失败,返回false return false; }
关键修正点
- out参数初始化:C#要求out参数在方法返回前的所有执行路径都必须被赋值,所以先通过
new T()初始化param - 调用Deserialize的对象错误:你之前试图调用param的Deserialize方法,实际上应该调用找到的
MessageSerializer<T>实例的Deserialize方法,该方法才是负责反序列化并返回T类型实例的逻辑 - 错误赋值序列化器:之前的
param = temp是把序列化器实例赋值给消息参数,类型不匹配,应该把Deserialize的返回值赋值给param - 异常处理:按照要求,需要捕获
InvalidMessageException来判断反序列化是否失败,失败则继续遍历下一个序列化器
内容的提问来源于stack exchange,提问作者NoOneCare
相关产品推荐
相关产品推荐

