加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 启用对结构的引用的属性语法?

发布时间:2020-12-15 17:25:19 所属栏目:百科 来源:网络整理
导读:据我所知,属性不能返回引用,并且由于结构是值类型,因此无法通过属性返回对结构的引用,这将启用: public struct SomeStruct{ public int SomeMember { get; set; }}class foo{ private SomeStruct bar; public SomeStruct Bar{ get { return bar; } set { ba
据我所知,属性不能返回引用,并且由于结构是值类型,因此无法通过属性返回对结构的引用,这将启用:

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

解决方法

使您的结构实现不可变并执行此操作:

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是一个问题,就像转换为接口一样 – 不可变的结构解决了这些问题.

还有另一个值得注意的要点 – 不要认为在性能问题确实存在之前存在性能问题.类定义可能与您从中获得的使用样式的结构一样快.分析是这里的王者.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读