【发布时间】: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# 中可行吗?
【问题讨论】:
-
显然您知道存在隐式转换运算符,那么为什么不直接在
string到CharArray中添加另一个隐式运算符呢? -
我刚刚注意到了。您的字节数组的初始长度在这里相当荒谬。静态隐式运算符不是您“丢失”此值的原因。当您执行
_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