我可以使用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 )并提供DateTimestring和类之间的隐式转换。 不建议,除非你打算在其他地方使用它。

  • 将属性更改为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