在Java中,我可以有一个像这样的对象:
public class MyObject {
private Date date;
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public void setDate(String date) {
this.date = parseDateString(date);
}
private Date parseDateString(String date) {
// do magic here
return dateObj;
}
}
Run Code Online (Sandbox Code Playgroud)
这很好,因为我的属性和多个setter有一个getter.我可以通过传入Date对象或String来设置"date"属性,然后让类弄清楚它.
在C#中,看起来事情有点不同.我可以做这个:
public class MyObject
{
public DateTime Date { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这里的速记显然是最佳的.但是,我不确定是否有任何内置方法可以重置setter以接受多种类型.我意识到我可以创建一个单独的公共方法来设置值,但这会牺牲使用对象初始化器的能力.
有没有办法直接重载C#公共属性的setter?或者这仅仅是语言限制,而且无法完成?
Jcl*_*Jcl 22
所有其他答案都是正确的...但如果你坚持,你可以通过以下几种方式做到:
使用第二个属性只有一个setter:
public string DateText { set { Date = ParseDateString(value); } }
Run Code Online (Sandbox Code Playgroud)
尽可能避免这种情况,只会增加混乱:-)
使用方法而不是属性(与在Java中一样).方法可以重载.这应该是最推荐的方式.
使用自定义类(而不是DateTime),并提供之间的隐式转换DateTime,string和你的类.除非你打算在其他地方使用它,否则不推荐使用.
将属性更改为object并在setter中提供您的转换:请不要这样做
Mat*_*don 16
嗯,你把苹果和香蕉比较.你在Java中有什么:
public void setDate(Date date) {
this.date = date;
}
public void setDate(String date) {
this.date = parseDateString(date);
}
Run Code Online (Sandbox Code Playgroud)
在C#中看起来像这样:
public void SetDate(Date date)
{
this.date = date;
}
public void SetDate(String date)
{
this.date = ParseDateString(date);
}
Run Code Online (Sandbox Code Playgroud)
唯一的区别是PascalCase成员名称和范围开放括号的位置.
您的Java代码有重载方法 ; 上面的C#有重载方法.
AFAIK你不能重载属性setter,因为:
public DateTime Date
{
get { return this.date; }
set { this.date = value; }
}
Run Code Online (Sandbox Code Playgroud)
...这里的类型value由成员的类型决定DateTime.
所以如果你想要方法重载,重载方法,而不是属性.请记住,无论如何,C#属性只是getter和setter方法的语法糖.
Ern*_*rno 10
自动属性不支持此功能.所以你必须像在Java中那样做.
当然你也可以混合这些:提供一个自动属性和额外的set方法来使用不同的类型设置属性.
public class MyObject
{
public DateTime Date { get; set; }
public void SetDate(string date)
{
this.Date = DateTime.Parse(date);
}
}
Run Code Online (Sandbox Code Playgroud)
Blu*_*eft 10
我将写一个不同的答案并声称
public void setDate(Date date) {
this.date = date;
}
public void setDate(String date) {
this.date = parseDateString(date);
}
Run Code Online (Sandbox Code Playgroud)
开始时是不好的做法.
通过执行上述操作,您声明字符串和日期都是有效值Date.事实并非如此 - 你真正想要的是一个Date.如果用户有一个字符串并希望它转换为a Date,那么他们应该依赖DateAPI中的字符串解析功能(DateFormat.parse()在Java中,DateTime.Parse()在C#中),而不是你的API.
如果Date是由您定义的类,并且您确实希望Date并且string可以互换,则应该在类中使用隐式对话Date,而不是要求Date类的用户编写重载.