我可以使用C#中的不同类型初始化一个类的公共属性吗?
在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;
}
}
这很好,因为我的属性有一个getter和多个setter。 我可以通过传递一个Date对象或一个String来设置“date”属性,然后让这个类找出它。
在C#中,看起来事情有点不同。 我可以做这个:
public class MyObject
{
public DateTime Date { get; set; }
}
这里的速记显然是最佳的。 但是,我不确定是否有任何内置的方式来重载setter以接受多种类型。 我意识到我可以创建一个单独的公共方法来设置值,但这会牺牲使用对象初始值设定项的能力。
有没有什么办法可以直接在C#的公共属性上重载setter? 或者这仅仅是一种语言限制,它不能完成?
所有其他答案都是正确的......但如果你坚持 ,你可以用几种方式来做到这一点:
仅使用setter就可以使用第二个属性:
public string DateText { set { Date = ParseDateString(value); } }
如果可能,避免这种情况,它只会增加困惑:-)
使用方法而不是属性(与在Java中所做的相同)。 方法可以重载。 这应该是最推荐的方式。
使用自定义类(而不是DateTime
)并提供DateTime
, string
和类之间的隐式转换。 不建议,除非你打算在其他地方使用它。
将属性更改为object
并在设置器中提供您的转换:请勿执行此操作
那么,你正在比较苹果和香蕉。 你在Java里有什么:
public void setDate(Date date) {
this.date = date;
}
public void setDate(String date) {
this.date = parseDateString(date);
}
在C#中看起来像这样:
public void SetDate(Date date)
{
this.date = date;
}
public void SetDate(String date)
{
this.date = ParseDateString(date);
}
唯一的区别是PascalCase
成员名称和scope-opening大括号的位置。
您的Java代码重载了方法; 上面的C#已经重载了方法。
AFAIK你不能重载一个属性设置器,因为:
public DateTime Date
{
get { return this.date; }
set { this.date = value; }
}
... value
的类型取决于成员的类型,这里是DateTime
。
所以如果你想方法重载,重载方法,而不是属性。 请记住,C#属性无论如何都只是getter&setter方法的语法糖。
自动属性不支持这一点。 所以你必须像在Java中一样做。
当然,你也可以混合使用它们:提供一个自动属性和额外的set-methods来设置使用不同类型的属性。
public class MyObject
{
public DateTime Date { get; set; }
public void SetDate(string date)
{
this.Date = DateTime.Parse(date);
}
}
链接地址: http://www.djcxy.com/p/75169.html
上一篇: Can I initialize public properties of a class using a different type in C#?
下一篇: Socket throws nullreferenceexception while asynchrously receiving data