【问题标题】:Can I overload the = assignment operator? [duplicate]我可以重载 = 赋值运算符吗? [复制]
【发布时间】:2021-10-22 15:27:38
【问题描述】:

如果我有这样的用户自定义类型,使用该类型时会有一些噪音,因为您必须在分配或读取内容时添加 propertyname 值

public class CharArray
{
    private byte[] _value;

    public CharArray(int length)
    {
        _value = new byte[length];
    }

    public string Value
    {
        get => Encoding.ASCII.GetString(_value);
        set
        {
            if (value.Length > _value.Length)
                throw new Exception($"Max length is {_value.Length} characters");

            _value = Encoding.ASCII.GetBytes(value.PadRight(_value.Length));
        }
    }
}

所以用法会是这样的:

CharArray field = new CharArray(10);
field.Value = "Test";
string fieldAsString = field.Value;

在读取值时摆脱 Value 属性非常容易,只需添加一个隐式运算符即可。这将使 CharArray 的用户在读取值时避免“.Value”

    public static implicit operator string(CharArray c)
    {
        return c.Value;
    }

但是,我还没有找到在分配值时避免使用 .Value 属性的方法。有什么想法吗?

我不能使用静态方法,因为我需要构造函数中给出的值。所以我想我正在寻找一种在非静态方法中重载 = 运算符的方法。这在 C# 中可行吗?

【问题讨论】:

  • 显然您知道存在隐式转换运算符,那么为什么不直接在stringCharArray 中添加另一个隐式运算符呢?
  • 我刚刚注意到了。您的字节数组的初始长度在这里相当荒谬。静态隐式运算符不是您“丢失”此值的原因。当您执行_value = Encoding.ASCII.GetBytes(...) 时,您已经失去了该价值。 GetBytes 不关心分配前_value 的长度。它返回一个数组,其字节数刚好足以对字符串进行编码,不一定_value 的长度完全一样。
  • @SnowGroomer 我是否过度简化了示例代码?真正的代码是用于在诸如 COBOL 或 C 之类的语言中定义的结构的类型定义,其中字符串是固定大小的字符数组。这种固定大小的字符数组的长度在构造函数中给出。
  • 在此处查看可重载(和不可重载)运算符的列表:docs.microsoft.com/en-us/dotnet/csharp/language-reference/… 我很惊讶没有人发布此内容。很清楚=属于哪个组。
  • @Olivier Rogier:是的。这不是我所希望的,但至少它解释了为什么这是不可能的。谢谢。 (您想将其添加为答案,而不仅仅是评论?)

标签: c# operator-overloading operator-keyword assignment-operator


【解决方案1】:

你可以在其他方向进行隐式转换string -> CharArray:

public static implicit operator CharArray(string s)
{
    return new CharArray(s.Length){ Value = s };
}

然后这个工作:

CharArray field = new CharArray(10);
field = "Test"; // all good!
string fieldAsString = field;

【讨论】:

  • 我会松开原始构造函数中给出的长度(即值 10)
  • 那么你正试图覆盖.Value =,而不仅仅是= 运算符,正如你所说。这是不可能的。
  • 对于任何寻找这个的人,这里给出了不可能的原因stackoverflow.com/questions/18782218/…
猜你喜欢
  • 2019-04-16
  • 1970-01-01
  • 1970-01-01
  • 2017-11-21
  • 2021-05-08
  • 2013-10-05
  • 1970-01-01
  • 2019-11-17
  • 2018-05-13
相关资源
最近更新 更多