据我所知,属性不能返回引用,并且由于结构是值类型,因此无法通过属性返回对结构的引用,这将启用:
public struct SomeStruct
{
public int SomeMember { get; set; }
}
class foo
{
private SomeStruct bar;
public SomeStruct Bar{ get { return bar; } set { bar = value; } }
}
//Somewhere else
foo f = new foo();
f.Bar.SomeMember = 42; //Error, this doesn't work
我是否必须求助于setMemberOfSomeStruct()还是有另一种方式?
编辑:具体来说,我想避免为这些结构一直调用new。我知道使用构造函数SomeStruct(int),这将起作用:
f.Bar = new SomeStruct(42); //ugh
答案 0 :(得分:2)
让您的struct
实施 不可变 并执行此操作:
var newSomeStruct = new SomeStruct(42 /* Feeds SomeMember */);
var myFoo = new Foo();
myFoo.Bar = newSomeStruct;
public struct SomeStruct
{
private int _someMember;
public int SomeMember { get { return _someMember; } }
public SomeStruct(int someMember)
{
_someMember = someMember;
}
}
不可变结构有助于保留预期的值类型语义。
如果你不使它成为不可变的,那么上面的代码仍然是让它工作的唯一方法。
或者,但看起来不太好看,在类上公开一个方法来设置类SomeStruct
的副本:
public void SetSomeMember(int val)
{
_bar.SomeMember = val; // Note _bar in this example is a field, not a property.
}
我只是为了完整性而提供这个,我仍然沿着不变的路线走下去,因为对于“可变结构是邪恶的”存在共识。属性getter是一个问题,就像转换为接口一样 - 不可变的结构解决了这些问题。
还有另一个值得思考的问题 - 不要认为在性能问题确实存在之前存在性能问题。对于您从中获得的使用方式,class
定义可能与struct
一样快。分析是这里的王者。
答案 1 :(得分:0)
看起来你有一个可变的结构which isn't recommended。
但要直接回答你的问题:创建一个副本,改变它,然后使用mutated struct设置属性。
var barCopy = f.Bar;
barCopy.SomeMember = 42;
f.Bar = barCopy;
顺便说一下:
据我了解,属性不能返回引用。
当然,他们可以 - 引用类型的属性从getter返回引用。
由于结构是值类型,因此无法通过属性返回对结构的引用。
当然有,你可以返回对盒装结构的引用。例如:
public IComparable Property { get { return 42; } }