类方法能否接收自身类为参数?Position类存储方法归属及序列化疑问
嘿,咱们来一步步拆解你的问题,从核心疑惑到具体实现给你捋清楚:
问题拆解与解决方案
1. Save方法是否应该作为Position类的成员?
这本质是个面向对象设计的选择,核心看你更倾向哪种思路:
- 若遵循单一职责原则:Position类的本职是封装位置数据(X_long、Y_lat),而“保存到Web服务”属于数据持久化职责,更适合抽离到独立类(比如
PositionService或PositionRepository)。这样类的职责更清晰,后续修改保存逻辑(比如换API、加缓存)时,无需改动Position类。 - 若为简单场景(小型项目、逻辑单一):把Save作为Position的成员也完全可行,调用起来更直观(比如
myPosition.Save()),属于“主动对象”的设计思路。
两种方案都没问题,取决于你的项目规模和维护需求。
2. 如果放在类里,如何正确实现Save方法?
你之前给Save方法加Position参数其实没必要——要保存的就是当前实例本身!C#里用this关键字指代当前对象,直接序列化this即可,不用新建Position对象,代码更简洁:
public class Position { public double X_long { get; set; } public double Y_lat { get; set; } public void Save() { var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://myserver.com/ApiTest/api/Position"); httpWebRequest.ContentType = "application/json"; httpWebRequest.Method = "POST"; ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) { // 直接序列化当前实例this,无需额外参数 string json = JsonConvert.SerializeObject(this); streamWriter.Write(json); streamWriter.Flush(); } string result = TryWebRequest(httpWebRequest); } }
调用时只需:
var myPos = new Position { X_long = 123.45, Y_lat = 67.89 }; myPos.Save();
3. 关于序列化的两个顾虑解答
会不会触发无限递归?
完全不会。你序列化的是this(Position实例的属性),而Save方法是类的成员方法——Json.NET(JsonConvert默认使用的库)不会序列化方法,只会序列化公共属性和字段,所以序列化过程只会处理X_long和Y_lat,根本不会涉及Save方法,自然不存在递归问题。
Save方法会不会被序列化到JSON里?
同样不会。Json.NET默认只序列化公共实例属性(比如你的X_long、Y_lat)和公共字段,方法、静态成员、私有成员都不会被包含进JSON。如果你实在担心,也可以给Save方法加[JsonIgnore]特性,但其实完全没必要,默认就不会被序列化。
额外建议:更优雅的设计(推荐)
如果项目规模稍大,还是建议把保存逻辑抽离到独立类,比如:
public class Position { public double X_long { get; set; } public double Y_lat { get; set; } } public class PositionService { public void SavePosition(Position sp) { // 复用原来的Web请求逻辑 var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://myserver.com/ApiTest/api/Position"); httpWebRequest.ContentType = "application/json"; httpWebRequest.Method = "POST"; ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) { string json = JsonConvert.SerializeObject(sp); streamWriter.Write(json); streamWriter.Flush(); } string result = TryWebRequest(httpWebRequest); } }
调用时:
var myPos = new Position { X_long = 123.45, Y_lat = 67.89 }; var service = new PositionService(); service.SavePosition(myPos);
这种方式的好处:
- Position类专注做数据载体,职责单一
- 保存逻辑可独立复用,多个地方需保存Position时无需重复写代码
- 后续修改保存逻辑(比如加日志、换API地址)时,只需改动PositionService,不影响Position类
内容的提问来源于stack exchange,提问作者Juan Carlos Oropeza
相关产品推荐
相关产品推荐

