You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

类方法能否接收自身类为参数?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:10:18