1

我是 Java 专家,所以在 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");
            }
        }

value在这个 cade 中是一个类似于 1987123019 的字符串

4

3 回答 3

8

因为您在最后一行分配属性本身。您应该使用不同的大小写或下划线来区分属性或字段。

我会推荐标准的 C# 命名约定。还要以原始格式保存数据。还有 driis 所说的。

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;
        }
    }
于 2012-09-15T12:36:36.680 回答
4

这会给你一个 StackOverflowException,因为你在set(和get,就此而言)的最后一行递归地调用属性设置器。您需要将值分配给类的字段,并从 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方法不适用于日期。这是因为DateTime在 C# 中是不可变的,因此在构造后无法更改。您需要将date变量分配给以下结果ToLocalTime()

date = date.ToLocalTime();
于 2012-09-15T12:37:20.487 回答
0

对于属性过程,getter 应该返回保存“包装”值的类成员变量的值。对于 setter,应将入站值分配给该类成员变量。您正在做的事情使该属性具有自我参照性。

于 2012-09-15T12:41:19.300 回答