1

假设您有如下属性:

Person person1;


public Person Captin{
    get{
        return person1;
    }
    set{
        person1 = value;
    }
}

public void SomeFunction(){
    Captin.name = "Hook"
}

在这种情况下,如果您在属性上设置名称,我们知道 Hook 的新名称将应用于 person1 的基础值。如果我们的实现有点不同怎么办?

public Person Captin{
    get{
        return ReadCaptinFromDisk();
    }
    set{
        WriteCaptinToDisk(value);
    }
}

public void SomeFunction(){
    Captin.name = "Hook"
}

在这种情况下,为了正确设置基础值,我们需要调用 Captin 的设置代码作为对 Captin.name 的赋值的一部分。

我有兴趣知道参数集代码是否会调用属性引用上的字段分配或方法调用集。特别是对于需要将值传播到磁盘(等)的这种情况。

4

4 回答 4

4

每次您访问您的属性 Captin 时,它都会从磁盘读取。但是,如果您更改属性“名称”,它将不会写入磁盘。如果您执行类似的操作,它只会写入磁盘

public void SomeFunction() {
   Person p = Captin;
   p.name = "Hook";
   Captin = p;
}
于 2008-11-20T16:33:50.033 回答
1

正如@Joe 所说,它不会写入磁盘。我只是想补充一点,这是因为您只使用了 getter,而不是 setter。@Joe 的示例同时使用了两者。

在我看来,这既是对 getter 的非常糟糕的使用,又违反了关注点分离。您应该有一个数据层来处理持久化数据。这个逻辑不应该在您的业务对象中。

于 2008-11-20T16:41:24.370 回答
1

只有当有人实际直接分配给它时,才会调用该属性的 setter。

至于您的代码是否可以:这是文档问题。

每当你有一个属性返回可变的东西时,你应该指出它是否会发生什么突变。您是返回“真实”数据的副本,还是返回真实数据本身?当一个属性(或普通方法)返回某种集合时,这经常出现——它是可变的?如果我改变它会发生什么?

如果您记录您的属性​​并解释返回的数据只是一个副本,并且更改不会反映在任何地方,那很好。如果你让它模棱两可,那就是你遇到问题的时候。

当然,不变性消除了这些担忧......

于 2008-11-20T17:15:14.160 回答
1

类类型变量、参数、字段、返回值或其他此类存储位置应被视为持有“对象 ID”。如果某个对象Foo有一个Bar由 field 支持的某个类类型的属性_Bar,并_Bar持有“object id#24601”,那么该语句Foo.Bar.Text = "George"将调用Text对象#24601 上的setter,其值为“George”。请注意,此语句不会修改对象Foo本身(其字段_Bar在语句执行之前将保留“object id#24601”,并且在执行后仍将保留);但是,它可能会影响对象 #24601。

结构类型的存储位置应被视为保存其所有字段(公共和私有)的内容。如果Foo.Boz是 type 的属性Rectangle(它是一个结构)和支持 field _Boz,则访问Foo.Boz将创建一个新的 type 临时实例Rectangle,其所有字段都将从Foo._Boz. 尝试读取Foo.Boz.X会将 的所有字段复制_Boz到临时实例,然后访问X该实例的字段。

请注意,一些非常古老和邪恶的 C# 编译器会将代码解释为Foo.Boz.X = 5;as Rectangle temp; temp.X = 5;,丢弃 temp 的结果值但不发出任何警告。这样的编译器行为导致一些人声明结构应该是“不可变的”,以确保这样的代码会产生编译器错误而不是产生虚假行为。不幸的是,这种信念一直持续到今天,尽管任何体面的编译器都会禁止这样的代码,即使X是可变字段。

请注意,更新可变结构类型的属性的正确惯用方法是:

  矩形温度 = MyListOFRectangles[5];
  温度 X = 5;
  MyListOFRectangles[5] = temp;

如果Rectangle已知有一个名为X, 并且MyListOfRectangles是 a的公共整数字段,则List<Rectangle>无需了解 的任何Rectangle其他属性、构造函数等,即可知道上述代码将更改MyListOfRectangles[5].X但不会影响任何其他属性的MyListOfRectangles[5],也不是 的任何属性MyListOfRectangles[4]。很好,清晰,简单。与任何其他类型的数据类型不同,暴露字段结构允许以清晰一致的方式对值进行分段编辑。

于 2012-07-18T18:42:10.857 回答