具有不同设置和获取类型的访问器?

Nic*_*ick 19 c# variables types accessor

简单的问题,希望是一个简单的答案:

我想做以下事情:

private DateTime m_internalDateTime;
public var DateTimeProperty
{
   get { return m_internalDateTime.ToString(); } // Return a string
   set { m_internalDateTime = value; } // here value is of type DateTime
}
Run Code Online (Sandbox Code Playgroud)

以上只是我想要做的一个例子.我想要一个x类型的内部变量的公共访问器.我希望将该变量作为字符串获取,但使用x类型设置它.

这可能吗?

- 编辑 -

我才意识到我可以做一些像:

private DateTime m_internalDateTime;
public object DateTimeProperty
{
   get { return m_internalDateTime.ToString(); } // Return a string
   set { m_internalDateTime = (DateTime)value; } // here value is of type DateTime
}
Run Code Online (Sandbox Code Playgroud)

但是,假设我使用类型y而不是"字符串"作为我的"获取"类型.如果我想在我的代码中使用"DateTimeProperty",我必须抛出它.

Mic*_*ren 10

不.显然,您可以在调用代码中添加.ToString(),但如果没有不同的名称,则无法执行您的建议:

private DateTime m_internalDateTime;
public DateTime SetDateTime { set { m_internalDateTime = value; } }
public string GetDateTime   { get { return m_internalDateTime.ToString(); } } 
Run Code Online (Sandbox Code Playgroud)

或者,甚至更好地使用方法而不是属性(如评论中所述):

private DateTime m_internalDateTime;
public void SetDateTime(DateTime dateTime) { m_internalDateTime = dateTime; }
public string GetDateTime() { return m_internalDateTime.ToString(); }
Run Code Online (Sandbox Code Playgroud)

请记住,var隐式,编译时类型VAR iables,而不是动态的变量.

绝对不要做你在编辑中记下的内容.它引入了常规的中断,可能的性能影响(尽管是轻微的),以及显着的本地化问题.

  • 如果您要使用GetDateTime和SetDateTime,它们应该是方法而不是属性. (9认同)
  • @Nick:因为方法就像动词对某个对象有所作为,而属性就像是对该对象说些什么的名词.SetDateTime和GetDateTime是动词,因此应该是方法. (8认同)

Tim*_*ter 5

作为一个财产,这是不可能的.您可以创建具有不同类型的Get和Set方法,但对于属性,类型必须相同.

编辑:

而:

private DateTime m_internalDateTime;
public object DateTimeProperty
{
   get { return m_internalDateTime.ToString(); } // Return a string
   set { m_internalDateTime = (DateTime)value; } // here value is of type DateTime
}
Run Code Online (Sandbox Code Playgroud)

在语法上是正确的,将编译并允许您接受DateTime作为输入并返回一个字符串,这不是一个好的计划.它有效,但它使您和任何人访问此代码,执行不需要的验证.此外,它将来很容易受到其他开发人员的攻击,不知道或者意识到隐藏的规则,因为您已经失去了编译时的安全性.此外,它几乎不再需要以强类型方式创建两个属性或两个实现相同目标的方法.

就个人而言,我建议使用两种方法(请参阅Jeff Yates的评论以获得有关原因的详细解释).

private DateTime m_internalDateTime;
public string GetDateTime()
{
    return m_internalDateTime.ToString();
}

public void SetDateTime(DateTime dateTime)
{
    m_internalDateTime = dateTime;
}
Run Code Online (Sandbox Code Playgroud)


小智 5

也许这有帮助

public class TDecimal
{
    private decimal? m_value;
    public bool HasValue { get { return m_value.HasValue; } }
    public decimal Value { get { return m_value.Value; } }

    public static implicit operator TDecimal(string a_value)
    {
        decimal d;
        if (decimal.TryParse(a_value, out d))
        {
            return new TDecimal() {m_value = d};
        }

        return new TDecimal() {m_value = null};
    }

    public static implicit operator decimal(TDecimal a_value)
    {
        if(a_value.HasValue)
        {
            return a_value.Value;
        }

        throw new ArgumentNullException("a_value");
    }
}

public class A
{
    public TDecimal Prop { get; set; }
}
Run Code Online (Sandbox Code Playgroud)


A a = new A();

a.Prop = "123";
if (a.Prop.HasValue)
{
    decimal d = a.Prop;
}
Run Code Online (Sandbox Code Playgroud)