C# 类中的方法能否接收与参数相同的类?

C# 类中的方法能否接收与参数相同的类?,c#,class,C#,Class,我有一节课 public class Position { public double X_long { get; set; } public double Y_lat { get; set; } } 我有一个单独的函数将职位发送到我的Web服务 private void PositionSaveWeb(Position sp) { var httpWebRequest = (HttpWebRequest)WebRequest

我有一节课

public class Position
{
    public double X_long { get; set; }
    public double Y_lat { get; set; }
}
我有一个单独的函数将职位发送到我的Web服务

private void PositionSaveWeb(Position sp)
{
    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();
        streamWriter.Close();
    }

    string result = TryWebRequest(httpWebRequest);
}
我想知道我是否可以/应该将该方法添加到类中,或者是否可以像现在这样:

public class Position
{
    public double X_long { get; set; }
    public double Y_lat { get; set; }

    public void Save (Position sp) {
    }
}
我这里的问题是:

  • 在javascript中,当您声明一个类时,您拥有
    this
    。因此我可以调用
    JsonConvert.SerializeObject(this)
    
  • 现在这个类也包含了一个方法,这个方法也会被序列化吗

那么
Save
应该是类的一种方法吗?如果是,我如何添加它?

您完全可以将
Save
方法添加到类中。但是,由于您没有使用
Position
对象本身,
Save
方法应该是
static

public static void Save (Position sp) {
    ...
}
用你正在创造的东西来创造一些东西,感觉很奇怪

使用
static
解决了这个问题

该类还包括一个方法,该方法是否也被序列化

在C#中,方法不是对象(尽管存在描述方法的对象,即
MethodInfo
),因此,方法不会被序列化。

不包含方法,因此您添加到位置的任何方法都不会被包括在内

在这种情况下,您也可以在C#中使用
this
,就像在JavaScript中一样。虽然它们的意思略有不同,但您可以使用它来引用当前对象

class Test {
    public void test() {
        Console.WriteLine(this);
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        Test test = new Test();
        test.test();
    }
}
将输出
测试
()

注 也就是说,我仍然不建议将Save方法添加到职位本身,因为您很可能添加了太多的职责,违反了

如果将Position参数保留在Position方法上,则没有人能够正确扩展该类,从而也破坏了该方法

如果你像@dasblinkenlight所说的那样将其设置为静态,那么你也破坏了


JavaScript是一种函数式语言,但C#是面向对象的。虽然您可以在另一个(例如TypeScript)上实现/强制一个,但从长远来看,您可能会面临其他问题。你总是可以引入新的类来分解感觉奇怪的代码,这是我在本例中的建议。

要直接回答标题问题,类可以有一个带有参数的方法,如果它是自己的类型,这是正常的

public class Values
{
    public int X { get; set; }
    public int Y { get; set; }

    public void Add(Values other)
    {
        X += other.X;
        Y += other.Y;
    }
}
方法不会被序列化,因此无论是否使用该方法,类都会被序列化


我绝对不会把
PositionSaveWeb
方法放在你的
Position
类中。
Position
类的目的是表示一个职位。你可以用这个类做很多事情——序列化它,在
HttpRequest
中发布它,在电子邮件中发送它,等等。但是这些事情不是这个类的责任

这叫做单一责任原则。一个类只有一个目的,而且只有一个改变的理由。因此,如果您确定
位置有三个点,您可能会更改该类。但是您不想更改该类,因为现在您想通过一些不同的方法发送它


因此,在本例中,我建议
PositionSaveWeb
应该是它自己的类。

为什么需要为该方法指定参数?如果你有一个
Position
对象,为什么不调用它的
Save
方法呢?@SamiKuhmonen这就是问题所在
JsonConvert.SerializeObject()
需要该对象。正如我在javascript中解释的那样,您使用
this
在C中的类内部进行自引用,不知道使用什么。C也有
this
。方法不会序列化。抱歉,我认为我解释错了。但是感谢静态的解释,这也是很好的了解。其思想是将方法添加到类中,只需使用
sp.Save()
,就不需要传递参数。但是我需要这个对象来调用
JsonConvert.SerializeObject(sp)