当前位置:  开发笔记 > 编程语言 > 正文

C#模仿覆盖赋值运算符(=)

如何解决《C#模仿覆盖赋值运算符(=)》经验,为你挑选了1个好方法。

我有一个简单的包装类我有一些问题.

它看起来像这样:

public class Wrapper
{
  private T _value;

  public Wrapper(T value)
  {
    _value = value;
  }

  public static implicit operator Wrapper(T value)
  {
    return new Wrapper(value);
  }

  public static implicit operator T(Wrapper value)
  {
    return value._value;
  }
}

我已经覆盖了T的隐式转换器,因此它的行为几乎就像是T本身的一个实例.

例如

Wrapper foo = 42;

但是,在将一个Wrapper实例分配给另一个时,我遇到了一个小问题,因为我只想分配第二个Wrapper类的值.

所以现在,我必须这样做:

Wrapper foo = 42;
Wrapper bar = (int)foo;

或通过属性公开公开_value.

但是因为这是在一个库中,我不希望用户依赖于记住这个,你们有没有想过我怎么能模仿覆盖赋值运算符?

只更改指针的问题(就像将类实例分配给另一个时一样)是我有一个指向这些Wrapper对象的指针字典,所以我不能让它们一直在改变,因为字典会停止然后匹配.

我可以看看这有点令人困惑,所以如果我留下任何重要的东西,请随时问:-)



1> Jim Mischel..:

由于赋值运算符不能过载,因此没有一个真正好的解决方案.正如其他人所指出的那样,使用struct会给你你想要的赋值语义,但是你会遇到价值语义 - 通常不是一件好事.

一种选择是重载构造函数:

public Wrapper(Wrapper w)
{
    _value = w._value;
}

这会导致这种语法:

Wrapper foo = 42;
Wrapper bar = new Wrapper(foo);

虽然比你拥有的更冗长,但它读得更好.

或者你可以添加一个Clone方法(不是ICloneable接口),这样你就可以写:

Wrapper bar = foo.Clone();

你可以获得真正的创造力并使某些操作员超载,使其基本上没有任何作用 不过,我不建议这样做.使用运算符重载来处理这些事情通常会使代码变得模糊并经常中断.

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有