我更喜欢Java-Guy,因此在C#中处理getter / setter对我来说有点新鲜。 为什么这不起作用?
public String lastmodified {
get { return this.lastmodified; }
set
{
long ms = Int64.Parse(value);
var date = new DateTime(1970, 1, 1).AddSeconds(ms);
date.ToLocalTime();
this.lastmodified = date.ToString("HH_mm_yyyy");
}
}
值在这个cade中是一个像1987123019那样的字符串
答案 0 :(得分:8)
因为您要在最后一行分配属性本身。您应该使用不同的套管或下划线来区分属性或字段。
我会推荐标准的C#命名约定。还以原始格式保存数据。还有什么可以说的。
private DateTime lastModified;
public String LastModified {
get { return lastModified.ToString("HH_mm_yyyy"); }
set
{
long ms = Int64.Parse(value);
var date = new DateTime(1970, 1, 1).AddSeconds(ms);
date = date.ToLocalTime();
lastModified = date;
}
}
答案 1 :(得分:4)
这将使您获得StackOverflowException,因为您在set
的最后一行(以及get
)递归调用属性setter(就此而言)。您需要将值分配给类的字段,并从getter中的该字段读取它。您的当前代码只是无限地调用相同的属性访问器方法,直到用完堆栈空间。
常见的C#命名约定建议PascalCasing用于属性和方法名称,而camelCasing用于实例变量,可能以下划线为前缀。
此代码应该有效:
private string lastModified; // instance variable
public string LastModified
{
get { return this.lastModified; }
set
{
long ms = Int64.Parse(value);
var date = new DateTime(1970, 1, 1).AddSeconds(ms);
date = date.ToLocalTime();
this.lastModified = date.ToString("HH_mm_yyyy");
}
}
另外,“不工作”有点广泛;但我猜你会发现ToLocalTime
方法没有应用到日期。这是因为C#中的DateTime
是不可变的,因此在构造之后无法更改。您需要将date
变量分配给ToLocalTime()
的结果:
date = date.ToLocalTime();
答案 2 :(得分:0)
对于属性过程,getter应该返回包含“wrapped”值的类成员变量的值。对于setter,应将入站值分配给该类成员变量。你正在做的事情使该财产具有自我指涉性。