C#Getter / Setter无法正常工作

时间:2012-09-15 12:34:01

标签: c# getter-setter

我更喜欢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那样的字符串

3 个答案:

答案 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,应将入站值分配给该类成员变量。你正在做的事情使该财产具有自我指涉性。