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)但是我不知道如何序列化这个对象。除非我使用公共变量在方法中创建一个新的Position对象。但是用你正在创造的东西来创造一些东西会让人觉得很奇怪。我不想创建一个不定式递归循环之类的东西
- 现在这个类也包含了一个方法,这个方法也会被序列化吗
那么
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)代码>